2014-02-12 35 views
4

有沒有更好的方式來實現以下代碼:從xts改進多時間範圍子集的性能?

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,因爲我在使用「rbindlist」替換do.Call(rbind,...)或Reduce(rbind,...)方面有很好的性能。 data.table也有一些很酷的子集特性,這些我都不熟悉。另一方面,rbindlist和as.data.table將不會將xts對象作爲輸入,並且我不確定對時間序列數據子集使用data.table是個不錯的選擇。

如果還有其他想法,我很樂意嘗試。多謝提前。

+0

對於1.,請參閱http://stackoverflow.com/a/12029366/967840 – GSee

回答

4

如果瓶頸爲rbind.xts,此解決方案將更快,但瓶頸是每日時間子集。

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

時間的日子集在非UTC時區是緩慢的,因爲XTS目前POSIXct指數轉換成POSIXlt拿到一年的日子。

+0

轉換爲UTC的部分肯定是一個問題,因爲xts使用紀元存儲索引。是否有可能有多個索引(即爲本地時間添加額外的索引);或者只是強迫xts使用本地時間作爲索引?謝謝 –

+0

@ lui.lui:目前都不可能。也就是說,沒有什麼可以阻止你擴展xts,增加一個本地時間索引,並且寫一個'[.yourxts''方法來對這兩個索引進行子集合。只知道'POSIXlt'對象比'POSIXct'對象多佔用5倍的內存。 –