说我有以下示例分钟数据。
> data = xts(1:12, as.POSIXct("2020-01-01")+(1:12)*60*20)
> data
[,1]
2020-01-01 00:20:00 1
2020-01-01 00:40:00 2
2020-01-01 01:00:00 3
2020-01-01 01:20:00 4
2020-01-01 01:40:00 5
2020-01-01 02:00:00 6
2020-01-01 02:20:00 7
2020-01-01 02:40:00 8
2020-01-01 03:00:00 9
2020-01-01 03:20:00 10
2020-01-01 03:40:00 11
2020-01-01 04:00:00 12
这个已经对齐的分钟数据,但是现在我想按小时获取。
简单,只需使用to.hourly命令对吧?
> to.hourly(data)
data.Open data.High data.Low data.Close
2020-01-01 00:40:00 1 2 1 2
2020-01-01 01:40:00 3 5 3 5
2020-01-01 02:40:00 6 8 6 8
2020-01-01 03:40:00 9 11 9 11
2020-01-01 04:00:00 12 12 12 12
问题在于,它将每个柱的最终值放入下一个柱,而最后一个值创建了自己的小时周期。
现在只显示正确的小时线,我使用align.time。
> align.time(to.hourly(data),60*60)
data.Open data.High data.Low data.Close
2020-01-01 01:00:00 1 2 1 2
2020-01-01 02:00:00 3 5 3 5
2020-01-01 03:00:00 6 8 6 8
2020-01-01 04:00:00 9 11 9 11
2020-01-01 05:00:00 12 12 12 12
上一个最后一个条目创建了自己的小时条,我需要删除它。
如果我转换为每日,则发生相同的问题,最后一次进入第二天,并创建了额外的一天。
问题是如何正确转换为不同的期间?
该示例的期望结果是:
data.Open data.High data.Low data.Close
2020-01-01 01:00:00 1 3 1 3
2020-01-01 02:00:00 4 6 4 6
2020-01-01 03:00:00 7 9 7 9
2020-01-01 04:00:00 10 12 10 12
这似乎是一个非常基本的选项,我已经搜索并找到了许多示例,但是没有一个示例考虑一个周期中的最后一个值。谢谢。
您可以将时间后移60秒,执行as.hourly
,然后将时间前移60秒。这样可以保持分组。您还需要重命名列:
setNames(shift.time(to.hourly(shift.time(data, -60)), 60), c("Open", "High", "Low", "Close"))
#> Open High Low Close
#> 2020-01-01 01:00:00 1 3 1 3
#> 2020-01-01 02:00:00 4 6 4 6
#> 2020-01-01 03:00:00 7 9 7 9
#> 2020-01-01 04:00:00 10 12 10 12