使用R data.table来子集高频时间序列(用data.table替换xts功能)

时间:2016-09-18 05:37:51

标签: r data.table posixct

我希望每天使用data.table在特定时间之间获取所有数据。

这是进行这些子集化的最有效(速度和记忆)方式吗?

R.data.table <- data.table(Time = Sys.time() + 1:86400, runif(86400))

R.data.table[Time > as.POSIXct('2016-09-18 08:00:00') & Time < as.POSIXct('2016-09-18 09:00:00')]

我知道我可以使用xts,但我喜欢使用data.table,因为我可能会将这些子集数据集用于预测模型,所以我不需要转换。

我已经查看了有关Idate和Itime的data.table帮助,但我真的不知道如何将它们放在一起。它们是否更快速,更易于交互式工作?

对于类似的操作,这些是示例,我不是要求如何直接执行这些操作...,请提供每个月的最后2个工作日的所有数据,包括所有工作日。是这样做的,就像我在上面做最有效的方法一样,还是有更好的方法来操纵R中数据表的时间序列?

感谢

1 个答案:

答案 0 :(得分:0)

  

是不是像上面最有效的方法那样做,还是有更好的方法来处理R中的数据表的时间序列?

这些子设置(范围子设置)的最有效方法是使用between函数。不幸的是,它目前遭受bug的困扰,因此它没有比您使用的方法快。错误has been fixed(一旦合并了devel软件包)将在我们的CRAN类仓库(包括二进制文件)中发布。使用between的另一个原因是,将来仍有可能对其进行内部优化,以提高速度/内存,因为仍有改进的空间。第三种方法是使用非等距联接来获得预期的答案,但是这三种方法中最慢的。

library(data.table)
d = data.table(Time = as.POSIXct("2016-09-18 06:00:00") + 1:86400, runif(86400))
dn = as.POSIXct('2016-09-18 08:00:00')
up = as.POSIXct('2016-09-18 09:00:00')
d[Time > dn & Time < up]
d[between(Time, dn, up, incbounds=FALSE)]
d[.(dn=dn, up=up), on=.(Time>dn, Time<up)]
  

我已经看过IDate和ITime上的data.table帮助,但是我真的不知道如何将它们放在一起。他们更快,更轻松地进行交互工作吗?

它们可以更快,更精确。 I前缀代表整数。之所以引入它们,是因为POSIXct是数字,因此存在浮点算术问题。浮点的加入或分组可能在不同平台上导致不同的答案。整数类型具有更大的可移植性,可以针对排序或分组等操作进行优化。


有一个待处理的功能请求,要求更精确的日期时间数据类型:更快的内部日期/日期时间实现(具有ns分辨率。)https://github.com/Rdatatable/data.table/issues/1451


还有一个针对新的插曲的路线图:时间序列-有序观测 https://github.com/Rdatatable/data.table/issues/3453,您可能想咨询该问题以了解data.table为有序数据集提供的更多功能。只是xts提供的内容的一小部分,但通常经过高度优化。