从xts获取或分组每天数据的前5分钟

时间:2012-03-26 00:04:24

标签: r time-series subset xts

我想从每分钟的数据中对每天的前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社区。

2 个答案:

答案 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]