您好我希望按时间分配一些细微的数据。我通常使用xts
做类似的事情:
subset.string <- 'T10:00/T13:00'
xts.min.obj[subset.string]
获取每天上午10点到下午1点(含)之间的所有行,并将输出作为xts格式。但对我的目的来说有点慢......例如
j <- xts(rnorm(10e6),Sys.time()-(10e6:1))
system.time(j['T10:00/T16:00'])
user system elapsed
5.704 0.577 17.115
我知道data.table
速度快,并且在对大型数据集进行子集化时,我想知道是否与fasttime
包一起处理快速POSIXct创建,如果创建函数是值得的像
dt.time.subset <- function(xts.min.obj, subset.string){
require(data.table)
require(fasttime)
x.dt <- data.table(ts=format(index(xts.min.obj),"%Y-%m-%d %H:%M:%S %Z"),
coredata(xts.min.obj))
out <- x.dt[,some.subsetting.operation.using."%between%"]
xts(out,fastPOSIXct(out[,ts])
}
将xts.min.obj转换为data.table添加某种字符索引,然后使用data.table对相关行进行子集,使用输出行索引和fasttime来重新创建xts输出?或者对于已经高度优化并用C语言编写的东西来说,这是多少多余的操作?
答案 0 :(得分:6)
如果您可以在UTC
中指定范围,则可以执行以下操作:
j[(.index(j) %% 86400) %between% c(10*3600, 16*3600 + 60)]
# +60 because xts includes that minute; you'll need to offset the times
# appropriately to match with xts unless you live in UTC :)
j <- xts(rnorm(10e6),Sys.time()-(10e6:1))
system.time(j[(.index(j) %% 86400) %between% c(10*3600, 16*3600 + 60)])
# user system elapsed
# 1.17 0.08 1.25
# likely faster on your machine as mine takes minutes to run the OP bench