2012-12-17 32 views
2

一個簡單的問題:我知道如何在xts中幫助幾年,幾個月和幾天的時間序列子集:x['2000-05/2001']等等。按時間排序的子集xts對象

但是我怎樣才能在一天中的幾小時內對數據進行分類?我想在上午07:00到下午06:00之間獲取所有數據。也就是說,我想在業務時間內提取數據 - 與當天無關(稍後我會照顧週末)。幫助有一個例子的形式:

.parseISO8601('T08:30/T15:00') 

但這不適用於我的情況。有人有線索嗎?

+1

你能給一個可重複的例子嗎? – agstudy

+1

例如,如果你的'xts'對象被稱爲'x',那麼像'y < - x [「T09:30/T11:00」]'這樣的東西對我來說就是早晨會話的一部分。 – SlowLearner

+0

@agstudy sample.time = timeDate('2012-01-01 00:00:00')+ 15 * 60 *(1:500) data = 1:500 data.ts = xts(data,order.by = sample.time) data.ts [「T09:30/T11:00」] – Richard

回答

6

如果您的xts對象被稱爲x,那麼像y <- x["T09:30/T11:00"]這樣的東西對我來說就是例如早上會話的一部分。

3

出於某種原因,削減一天的XTS一次使用x["T09:30/T11:00"]是相當緩慢的,我使用R: Efficiently subsetting dataframe based on time of daydata.table time subset vs xts time subset的方法,使具有類似的語法更快的功能:

cut_time_of_day <- function(x, t_str_begin, t_str_end){ 

    tstr_to_sec <- function(t_str){ 
     #"09:00:00" to sec of day 
     as.numeric(as.POSIXct(paste("1970-01-01", t_str), "UTC")) %% (24*60*60) 
    } 

    #POSIX ignores leap second 
    #sec_of_day = as.numeric(index(x)) %% (24*60*60)        #GMT only 
    sec_of_day = {lt = as.POSIXlt(index(x)); lt$hour *60*60 + lt$min*60 + lt$sec} #handle tzone 
    sec_begin = tstr_to_sec(t_str_begin) 
    sec_end = tstr_to_sec(t_str_end) 

    return(x[ sec_of_day >= sec_begin & sec_of_day <= sec_end,]) 
} 

測試:

n = 100000 
dtime <- seq(ISOdate(2001,1,1), by = 60*60, length.out = n) 
attributes(dtime)$tzone <- "CET" 
x = xts((1:n), order.by = dtime) 

y2 <- cut_time_of_day(x,"07:00:00", "09:00:00") 
y1 <- x["T07:00:00/T09:00:00"] 

identical(y1,y2) 
+1

感謝您演示xts的每日時間子集化速度有多快!我[創建了一個問題](https://github.com/joshuaulrich/xts/issues/193)致力於改進它。 –