【问题标题】:Improving performance in multiple Time-Range subsetting from xts?从 xts 提高多个时间范围子集的性能?
【发布时间】:2014-03-11 05:41:28
【问题描述】:

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

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 对象的索引。如果对象很大,可能会耗费大量时间。

我看到一些帖子,如果时间是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 用于时序数据子集是否是一个不错的选择。

如果有其他想法,我愿意尝试。提前感谢很多。

【问题讨论】:

标签: r performance data.table xts subset


【解决方案1】:

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

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

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

【讨论】:

  • 转换为UTC的部分肯定是个问题,因为xts使用epoch存储索引。是否可以有多个索引(即为本地时间添加额外的索引);或者干脆强制 xts 使用本地时间作为索引?谢谢
  • @lui.lui:目前这些都不可能。也就是说,没有什么可以阻止您扩展 xts、添加本地时间索引以及编写 [.yourxts 方法来对两个索引进行子集化。只要知道POSIXlt 对象占用的内存比POSIXct 对象多约5 倍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 2013-06-25
  • 2017-11-12
  • 2012-08-05
  • 2017-09-24
相关资源
最近更新 更多