我想从每分钟的数据中对每天的前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社区。 p>
答案 0 :(得分:4)
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, ]))
答案 1 :(得分:2)
你使用包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]
编辑:
@Joshua 我认为这有效,看看这个例子:
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]
在我之前的例子中我犯了一个错误,我把five_min_period放在引号之间。 那是你指出约书亚的事吗?也许起点不是必要的,只是:
until5min=paste('/',five_minutes_after,sep="")
x[until5min]