r-从xts获取或细分每天前5分钟的数据



我想从分钟数据中减去每天时间序列数据的前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]

最新更新