R 按时间划分的xts对象子集

R 按时间划分的xts对象子集,r,time,time-series,xts,R,Time,Time Series,Xts,一个简单的问题:我知道如何在xts中对年、月、日的时间序列进行子集,从帮助:x['2000-05/2001']等等 但我如何按一天中的小时数对数据进行子集划分呢?我想获取上午7:00到下午6:00之间的所有数据。也就是说,我想在工作时间提取数据——与一天中的时间无关(我会在以后的周末处理)。“帮助”中有一个表单示例: .parseISO8601('T08:30/T15:00') 但这在我的情况下不起作用。有人有线索吗?如果你的xts对象被调用x,那么像y这样的东西由于某种原因使用x[“T09:

一个简单的问题:我知道如何在
xts
中对年、月、日的时间序列进行子集,从帮助:
x['2000-05/2001']
等等

但我如何按一天中的小时数对数据进行子集划分呢?我想获取上午7:00到下午6:00之间的所有数据。也就是说,我想在工作时间提取数据——与一天中的时间无关(我会在以后的周末处理)。“帮助”中有一个表单示例:

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

但这在我的情况下不起作用。有人有线索吗?

如果你的
xts
对象被调用
x
,那么像
y这样的东西由于某种原因使用
x[“T09:30/T11:00”]
来缩短一天中的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,])
}

如果你的
xts
对象被称为
x
,那么类似
y@agstudy sample.time=timeDate('2012-01-01 00:00')+15*60*(1:500)data=1:500 data.ts=xts(data,order.by=sample.time)data.ts[“T09:30/T11:00”]@SlowLearner你说得对。。它只是工作。。。我很困惑,因为我只是在时间索引上使用它,而不是在xts对象上使用它。适用于对象,它只是工作。data.ts[“T09:30/T11:00”]有效,但sample.time[“T09:30/T11:00”]无效。@SlowLearner。。。如果你的评论是一个答案,我会接受。。。感谢您演示xts的时间子集可以快多少!我必须努力改进它。对于那些想知道。。。上面的自定义函数仍然比内部xts函数快1000倍。@ricardo:我得到的结果快了数百倍,但还不接近1000倍。您能否共享您的基准测试和
sessionInfo()
输出?请随时发电子邮件给我。
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)