在xts包中的align.time()占用了大量的时间

时间:2018-02-21 09:38:52

标签: r data.table xts

我有~10 GB大小的文件(作为data.table格式),包含80M行和15列,
现在我尝试将Date_time列与最近的15分钟对齐,但代码

df$Date_time<-as.POSIXct(df$Date_time,format="%Y-%m-%d %H:%M:%S")           

df$Date_time <- align.time(df$Date_time-lubridate::minutes(8), n=60*15)

以上2个陈述需要花费大量时间才能运行。是否需要进行任何修改 减少执行时间?

提前致谢。

2 个答案:

答案 0 :(得分:1)

由于您使用的是data.table,因此您应该使用就地子集赋值运算符来避免不必要的副本。这只需要我的工作站几秒钟:

N <- 24*60*60*365*10
n <- 80e6
set.seed(22L)
ds <- seq(as.POSIXct("2017-02-21"), by = "1 min", length.out = N)    
dt <- data.table(Date_time = sample(ds, n), key = "Date_time")    
setorderv(dt, key(dt))
system.time({dt[, dt_aligned := align.time(Date_time - 8*60, n = 60*15)]})
#    user  system elapsed
#   2.632   0.808   3.441

另一个问题可能是您的机器没有足够的可用内存。当发生这种情况时,操作系统将开始使用物理驱动器空间作为虚拟内存,这比RAM慢很多。

答案 1 :(得分:0)

使用@ akrun的建议转换为POSIX后,您可能需要考虑使用data.table roll个连接来舍入到最接近的15分钟:

#generate a sequence of 15mins intervals
lookup <- data.table(Oldintvl15mins=seq(from=df[,as.POSIXct(as.Date(min(Date_time)))],
    to=df[,as.POSIXct(as.Date(max(Date_time)) + 1)], by="15 min"), key="Oldintvl15mins")[,
        intvl15mins := Oldintvl15mins]

#print original sample data
df

#roll to nearest
lookup[df, roll="nearest"]

示例数据:

N <- 24*60*60
set.seed(22L)
df <- data.table(Date_time=sample(seq(as.POSIXct(Sys.Date()), by="1 min", length.out=N), 1000), key="Date_time")
setorderv(df, key(df))