我有~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个陈述需要花费大量时间才能运行。是否需要进行任何修改 减少执行时间?
提前致谢。
答案 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))