我想从分钟数据中减去每天时间序列数据的前5分钟,但是前5分钟不是每天在同一时间发生的,因此使用类似xtsobj["T09:00/T09:05"]
的东西是不起作用的,因为前5分钟的开始发生了变化。即,有时它在上午9:20或早上的某个其他随机时间而不是上午9点开始。
到目前为止,我已经能够使用以下函数来划分每天的第一分钟:
k <- diff(index(xtsobj))> 10000
xtsobj[c(1, which(k)+1)]
即,在数据中找到大于10000秒的差距,但从这一差距到找到每天的前5分钟更为困难,因为数据并不总是均匀分布的。也就是说,在第一分钟到第五分钟之间,可能有2排到5排,因此使用类似的东西
xtsobj[c(1, which(k)+6)]
然后将结果结合在一起
并不总是准确的。我希望可以使用像"first"这样的函数,但不确定如何在多天内做到这一点,也许这可能是最佳解决方案。有没有更好的方法来获取这些信息?
提前感谢stackoverflow社区。
split(xtsobj, "days")
将为每天创建一个带有xts对象的列表。
然后您可以将head
应用于每天的
lapply(split(xtsobj, "days"), head, 5)
或者更一般地
lapply(split(xtsobj, "days"), function(x) {
x[1:5, ]
})
最后,如果你愿意的话,你可以用rbind
把日子重新安排在一起。
do.call(rbind, lapply(split(xtsobj, "days"), function(x) x[1:5, ]))
如果你使用包lubridate
,首先找出每天根据你随机变化的起点,然后使用函数minutes
所以它应该是这样的:
five_minutes_after = starting_point_each_day + minutes(5)
然后,您可以使用xts
的常用子集来执行以下操作:
5_min_period = paste(starting_point_each_day,five_minutes_after,sep='/')
xtsobj[5_min_period]
编辑:
@约书亚我认为这是可行的,看看这个例子:
library(lubridate)
x <- xts(cumsum(rnorm(20, 0, 0.1)), Sys.time() - seq(60,1200,60))
starting_point_each_day= index(x[1])
five_minutes_after = index(x[1]) + minutes(5)
five_min_period = paste(starting_point_each_day,five_minutes_after,sep='/')
x[five_min_period]
在我前面的例子中,我犯了一个错误,我在引号之间加了五分周期。你是这么指约书亚的吗?也可能起点不是必要的,只是:
until5min=paste('/',five_minutes_after,sep="")
x[until5min]