一个简单的问题:我知道如何将xts
中的时间序列分组为帮助中的年份,月份和日期:x['2000-05/2001']
,等等。
但是,如何在一天中按小时对数据进行子集化?我想在07:00 am到06:00 pm之间获取所有数据。即,我想在营业时间内提取数据 - 与当天无关(我稍后会照顾周末)。帮助有一个表单示例:
.parseISO8601('T08:30/T15:00')
但这不适用于我的情况。有人有线索吗?
答案 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 day和data.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