如何在 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