除Lubridate外,大数据量下高效实现时间半小时向上取整的方法?
高效实现时间向上取整到半小时的替代方案
针对20万条观测值的数据集,以下几种方法可以替代lubridate实现高效的时间向上取整到半小时,核心是避免逐行操作(rowwise),用向量化运算提升性能:
1. Base R 向量化原生实现
直接利用POSIX时间的数值特性(以秒为单位),全程向量化计算,不需要额外包:
# 先确保DateTime是POSIXct格式,若不是可先转换:as.POSIXct(DateTime, format = "%Y-%m-%d %H:%M:%S") Twr2CowDist1 <- Twr2CowDist %>% mutate(Round = as.POSIXct( ceiling(as.numeric(DateTime) / 1800) * 1800, origin = "1970-01-01", tz = attr(DateTime, "tzone") ))
原理:把时间转成从1970年开始的秒数,除以30分钟对应的秒数(1800)后向上取整,再转回POSIXct格式,全程批量处理,速度远快于逐行操作。
2. data.table 极致性能方案
如果处理超大数据集,data.table的原地修改特性能进一步减少内存开销,提升速度:
library(data.table) setDT(Twr2CowDist) Twr2CowDist[, Round := as.POSIXct( ceiling(as.numeric(DateTime)/1800)*1800, origin = "1970-01-01", tz = attr(DateTime, "tzone") )]
data.table的操作不会复制整个数据集,对于20万条数据来说,处理时间能压缩到几秒内。
3. 修复原lubridate方案(可选)
其实你之前的慢完全是因为提前用了rowwise——lubridate的ceiling_date本身是向量化的,只要去掉rowwise,原代码就能快速运行:
Twr2CowDist1 <- Twr2CowDist %>% mutate(DateTime = ymd_hms(DateTime), Round = ceiling_date(DateTime, "30 minutes"))
20万条数据的话,这个修改后的版本应该能在1分钟内完成。
内容的提问来源于stack exchange,提问作者shrimp
相关产品推荐
相关产品推荐

