从xts提高多个时间范围子集的性能?

时间:2014-02-12 17:52:01

标签: r performance data.table xts subset

是否有更好的方法来实现以下代码:

slice.periods <- function (x, periods, ...)
{
  if (!require("xts")) {
    stop("Need 'xts'")
  }
  Reduce(rbind.xts, lapply(periods, function(t) x[t], ...))
}

其中x是xts对象,句点是可迭代的章程列表,可由xts子集识别。样品使用:

j <- xts(rnorm(10e6),Sys.time()-(10e6:1))
v <- c("T10:00/T11:00", "T13:00/T15:00", "T20:30/T22:00")
system.time(slice.periods(j, v))

## result on my MacBook Air (1.8 GHz Intel Core i7; 4 GB 1333 MHz DDR3)
##  user  system elapsed 
## 14.956   0.876  15.837 

有几个问题:

  1. 如果每个子集都非常大,“减少”可能太慢
  2. 每个时间片都不是最佳的,因为它不直接使用来自xts对象的索引。如果对象很大,则可能需要花费大量时间。
  3. 我看到一些帖子,如果时间是UTC,通过直接访问有一些惊人的加速,请参阅以下帖子: data.table time subset vs xts time subset

    但是,我的应用程序需要本地时区夏令时。这使得夏季和冬季之间的UTC时间转换不同,并且上述方法不起作用。

    我还考虑使用data.table,因为我在替换do.Call(rbind,...)或Reduce(rbind,...)时使用“rbindlist”有一些很棒的性能。同样,data.table有一些很酷的子集功能,我不熟悉。另一方面,rbindlist和as.data.table不会将xts对象作为输入,我不确定使用data.table作为时间序列数据子集是一个不错的选择。

    如果有其他想法,我愿意尝试。非常感谢许多人。

1 个答案:

答案 0 :(得分:4)

如果瓶颈为rbind.xts,此解决方案会更快,但瓶颈是时间子集。

jv <- j[unlist(lapply(v, function(i) j[i, which.i=TRUE])),]

非UTC时区的时间子集速度很慢,因为xts目前会将POSIXct索引转换为POSIXlt以获取一年中的某一天。