子XTS对象按一天中的时间(Subset xts object by time of day)

2019-07-05 13:24发布

一个简单的问题:我知道如何子集,时间序列xts多年,从帮助月份和日期: x['2000-05/2001']等。

但是,我怎么能在这一天小时子集我的数据? 我想早上07:00和下午06:00之间获得的所有数据。 也就是说,我想提取期间业务时间的数据 - 不相关的一天(我照顾周末以后)的。 帮助的形式的一个例子:

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

但是,这并不在我的情况下工作。 是否有人有线索?

Answer 1:

如果您的xts被称为对象x事遂所愿y <- x["T09:30/T11:00"]的作品,我让上午的会议中分得一杯羹,例如。



Answer 2:

出于某种原因,使用切割天的XTS时间x["T09:30/T11:00"]是相当缓慢的,我使用来自方法R:基于一天的时间内有效地子集划分数据帧和data.table时间子集VS 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)


文章来源: Subset xts object by time of day