从一个xts数据中获取或筛选出每天的前5分钟数据

3
我想从分钟级别的数据中,每天提取前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个回答

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, ]))

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。Joshua,这就是你指出的问题吗?也许起始点不是必要的,只需:
until5min=paste('/',five_minutes_after,sep="")
x[until5min]

xtsobj['5_min_period'] 不起作用。你只能使用非常特定类型的字符串来对 xts 对象进行子集操作。 - Joshua Ulrich
我说xtsobj['5_min_period']不起作用,因为'5_min_period'不是xts能够识别的字符串。很高兴你纠正了这个错误。 - Joshua Ulrich
感谢@JoshuaUlrich的评论,特别是开发了一个非常有用的软件包。 - aatrujillob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接