在时间序列中分配周数以获得每周平均价格

时间:2011-12-28 23:43:18

标签: r date time-series

假设我有一个包含每日数据(工作日)的时间序列,我想按工作周组织数据。 (周一至周五)与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包的周函数,但效果不佳。似乎每年一次点击第53周,该功能未能在第二年的那一周正确启动。

我一直试图远离rep,seq / 5或/ 7类型的解决方案,因为可能会有一些观察结果我可能需要在稍后从数据中过滤掉,所以我希望有一个解决方案不依赖于我的数据的特定向量,而是我希望解决方案更通用,即依赖于日期类,即POSIcxt,xts或zoo类

任何提示都将不胜感激。

1 个答案:

答案 0 :(得分: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"