如何在 R 中将分钟数据正确转换为小时数据?
How to convert minute data to hourly data correctly in R?
假设我有以下样本分钟数据。
> 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
这似乎是一个非常基本的选项,我已经搜索并找到了很多示例,但没有一个考虑了一段时间内的最后一个值。谢谢。
更新:
Allan Cameron 给出了一个很棒的答案并且它绝对有效,我只是担心它会在不同时间段的某个时候失败。
我的工作流程从报价数据开始,我将其转换为秒和分钟等。将 tick 转换为更高的周期会很好地工作,但一次处理的数据太多,因此采用交错方法。这就是对齐数据需要与任何周期转换一起使用的原因。
我对 Allan 的代码做了小修改:
setNames(shift.time(to.hourly(shift.time(data, -.0000001193)), .0000001193), c("Open", "High", "Low", "Close"))
.0000001193 是我通过简单的反复试验发现的最小值。
是否有任何时候这不起作用或者最小值会有所不同?
这是处理这个问题的最佳方式吗?
谢谢。
您可以将时间后移 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
假设我有以下样本分钟数据。
> 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
这似乎是一个非常基本的选项,我已经搜索并找到了很多示例,但没有一个考虑了一段时间内的最后一个值。谢谢。
更新: Allan Cameron 给出了一个很棒的答案并且它绝对有效,我只是担心它会在不同时间段的某个时候失败。
我的工作流程从报价数据开始,我将其转换为秒和分钟等。将 tick 转换为更高的周期会很好地工作,但一次处理的数据太多,因此采用交错方法。这就是对齐数据需要与任何周期转换一起使用的原因。
我对 Allan 的代码做了小修改:
setNames(shift.time(to.hourly(shift.time(data, -.0000001193)), .0000001193), c("Open", "High", "Low", "Close"))
.0000001193 是我通过简单的反复试验发现的最小值。
是否有任何时候这不起作用或者最小值会有所不同?
这是处理这个问题的最佳方式吗?
谢谢。
您可以将时间后移 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