2011-12-28 70 views
2

假設我有一個包含每日數據(工作日)的時間序列,並且我想按業務週數組織數據。 (週一至週五)以類似的方式作爲對原油期貨價格的一個在這個網頁從EIA:指定時間序列中的星期數以獲取每週平均價格

http://www.eia.gov/dnav/pet/hist/LeafHandler.ashx?n=PET&s=RCLC1&f=D

正如你所看到的價格是很好的按周在這個網頁組織。 R中是否有可以用類似方式組織數據的函數?

您可以獲得在.xls格式的數據: http://www.eia.gov/dnav/pet/hist_xls/RCLC1d.xls

我想什麼做的是一個星期數分配給每個每日觀察是這樣的:(看周列)

 Date Price weeks day 
1983-04-04 29.44 1 Monday 
1983-04-05 29.71 1 Tuesday 
1983-04-06 29.92 1 Wednesday 
1983-04-07 30.17 1 Thursday 
1983-04-08 30.38 1 Friday 
1983-04-11 30.26 2 Monday 
... 
... 

到目前爲止,我已經使用了lubridate軟件包的week函數,但運行不正常。這似乎是第53週一年一次,該功能在第二年的一週內未能正常啓動。

我一直試圖遠離代表,seq/5或/ 7種解決方案,因爲可能有一些觀察,我可能需要從數據中過濾後,所以我想有一個解決方案,不依賴於我的數據的特定向量,而是我寧願解決方案更通用,即取決於日期類,即POSIcxt,xts或動物園類

任何提示將不勝感激。

+0

我在下面看到你的評論,但你仍然沒有說出你想要的數字作爲一個數字爲一年的增量。 – 2011-12-29 02:05:08

+0

所以你不想要一個數字;你只需要一週的時間 – 2011-12-29 02:27:45

+0

如果你想給一個數字指定兩週的數字,那麼你將需要告訴我們分配的數字是多少。 – 2011-12-29 02:42:05

回答

2

這是不是工作?:

as.POSIXlt()$yday %/% 7 

我意識到,這確實有你想要什麼,以避免部分,但它從一個公認的一流的繪製它的出發點。爲您的數據指出,我與colClasses=c("Date", "numeric","numeric","character")讀它:

> 1 + as.POSIXlt(dat$Date)$yday %/% 7 
[1] 14 14 14 14 14 15 

如果要複製的區間標籤,嘗試加入的7倍數的任何週一至週五:

paste(as.Date(strptime("1983 Apr- 4",format="%Y %b- %d"))+(39)*7, 
     " to ", 
     as.Date(strptime("1983 Apr- 8",format="%Y %b- %d"))+(39)*7, 
     sep="") 
@[1] "1984-01-02 to 1984-01-06" # The first new year change 
paste(as.Date(strptime("1983 Apr- 4",format="%Y %b- %d"))+(39+52)*7, 
     " to ", 
     as.Date(strptime("1983 Apr- 8",format="%Y %b- %d"))+(39+52)*7, 
     sep="") 
#[1] "1984-12-31 to 1985-01-04" # The second new year change 

這裏是一個函數,將接受一個整數向量:

from8Apr83dts <- function(numwks) { 
    paste(as.Date(strptime("1983 Apr- 4",format="%Y %b- %d"))+(numwks)*7, 
      " to ", 
      as.Date(strptime("1983 Apr- 8",format="%Y %b- %d"))+(numwks)*7, 
      sep="") 
            } 
# Usage 
from8Apr83dts(39:40) 
#[1] "1984-01-02 to 1984-01-06" "1984-01-09 to 1984-01-13" 
+0

從鏈接的示例數據看來,@AndresT希望這些數據是工作周,因此週一到週五將始終處於同一周。其中一種可能性是使用'strftime(as.POSIXlt(dat $ Date),format =「%W」)',但這並不總是連接兩週的一週中的日子(例如12月31日星期一1月4日星期五)。也許@AndresT可以澄清他想要在這樣的幾周內完成什麼...... – 2011-12-29 01:00:44

+0

你說你想讓它看起來就像你提供的例子。那是我做的。每週的時間間隔與您鏈接到的網站的時間間隔相匹配。如果你想要不同的東西,請提供清晰的說明。無論如何,我得到工作日(as.Date(「1984-01-02」)) [1]「星期一」 – 2011-12-29 02:48:02

+0

+1 - 尼斯work二進制。 – 2011-12-29 03:14:57