2013-06-27 50 views
4

嗨我正在尋找子集一些細微的數據的時間。我通常使用xts做這樣的事情:data.table時間子集與xts時間子集

subset.string <- 'T10:00/T13:00' 
xts.min.obj[subset.string] 

得到所有這些都是上午10點下午1點和(含)的每一天之間,並具有輸出作爲XTS格式的行。但對於我而言有點慢......如

j <- xts(rnorm(10e6),Sys.time()-(10e6:1)) 
system.time(j['T10:00/T16:00']) 
    user system elapsed 
    5.704 0.577 17.115 

我知道data.table爲v快速和子集化大型數據集使我一起琢磨是否與fasttime包,如果它處理速度快POSIXct創作,將是值得的創建像

dt.time.subset <- function(xts.min.obj, subset.string){ 
    require(data.table) 
    require(fasttime) 
    x.dt <- data.table(ts=format(index(xts.min.obj),"%Y-%m-%d %H:%M:%S %Z"), 
        coredata(xts.min.obj)) 
    out <- x.dt[,some.subsetting.operation.using."%between%"] 
    xts(out,fastPOSIXct(out[,ts]) 
} 

一個功能轉換的xts.min.obj成data.table添加某種字符索引,然後使用data.table於子集相關行使用輸出行用fasttime索引來重新創建一個xts輸出?或者對於已經高度優化並用C語言編寫的東西來說,這會產生太多的額外操作?

+0

對不起,什麼是你的問題?你知道%之間的'%',那麼你還想要什麼? – eddi

+0

好吧,不太清楚如何使用%與時間之間的%首先,並且此刻我將它轉換爲字符串而不是使用POSIXct,因爲我在POSIXct的印象子集中速度很慢... Plus我認爲它不適用於每一天... –

+0

每天的部分通過執行格式(...,「%H:%M」)%%(「10:00」,「13:00 「),但我仍然不確定爲什麼你需要'data.table'來爲* just * subsetting - 如果你的唯一目的是子集化,我非常懷疑它在'xts'和'data.table'之間來回切換但你總是可以給我們示例數據,你的操作很慢玩) – eddi

回答

4

如果你真行與指定的UTC你的範圍,你可以這樣做:

j[(.index(j) %% 86400) %between% c(10*3600, 16*3600 + 60)] 
# +60 because xts includes that minute; you'll need to offset the times 
# appropriately to match with xts unless you live in UTC :) 

j <- xts(rnorm(10e6),Sys.time()-(10e6:1)) 
system.time(j[(.index(j) %% 86400) %between% c(10*3600, 16*3600 + 60)]) 
# user system elapsed 
# 1.17 0.08 1.25 
# likely faster on your machine as mine takes minutes to run the OP bench 
+2

使用'.index'直接訪問數字索引。 –

+0

@JoshuaUlrich謝謝,修正 – eddi

+0

我沒有意識到你可以在data.table之外使用%之間的%,如果原始對象不是UTC,最好先轉換索引,然後轉換子集時間...如果在上午10點和下午4點之間尋找子集,它引用了在柏林設置時區的原始xts對象,那麼我會將這些對象轉換爲上午10點到UTC,那麼對嗎?即上午8點UTC?然後使用你的方法來實際的子集,最後再恢復到原來的時區? –