子集xts对象按时间

时间:2012-12-17 10:24:21

标签: r time time-series xts

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

但是,如何在一天中按小时对数据进行子集化?我想在07:00 am到06:00 pm之间获取所有数据。即,我想在营业时间内提取数据 - 与当天无关(我稍后会照顾周末)。帮助有一个表单示例:

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

但这不适用于我的情况。有人有线索吗?

2 个答案:

答案 0 :(得分:7)

如果您的xts对象被调用x,那么y <- x["T09:30/T11:00"]之类的内容就可以让我获得上午会话的一部分。

答案 1 :(得分:4)

出于某些原因,使用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的时间非常慢,我使用R: Efficiently subsetting dataframe based on time of daydata.table time subset vs xts time subset中的方法以类似的语法创建更快的函数:

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)

测试:

var foo, bar, baz