簡體   English   中英

子集xts對象按時間

[英]Subset xts object by time of day

一個簡單的問題:我知道如何將xts時間序列xts為年,月和日:幫助: x['2000-05/2001']等等。

但是,如何在一天中的幾個小時內對我的數據進行子集化? 我想在07:00 am到06:00 pm之間獲取所有數據。 即,我想在營業時間內提取數據 - 與當天無關(我稍后會照顧周末)。 幫助有一個表單示例:

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

但這在我的情況下不起作用。 有人有線索嗎?

例如,如果你的xts對象被稱為x那么y <- x["T09:30/T11:00"]對我來說可以獲得早晨會話的一部分。

由於某種原因使用x["T09:30/T11:00"]減少xts時間非常慢,我使用R中的方法:根據時間data.table時間子集與xts時間 有效地對數據幀 進行子集化使用類似語法創建更快的函數的子集

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM