假设我有一个包含每日数据(工作日)的时间序列,我想按工作周组织数据。 (周一至周五)与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类
任何提示都将不胜感激。
答案 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"