如何用R data.table将时分秒时间映射为日内15分钟间隔分组?
实现方案
直接利用lubridate::seconds_since_midnight()获取当日0点到对应时间的总秒数,除以15分钟对应的秒数后向上取整即可得到分组号,全程基于data.table的原地赋值操作,内存占用低、运算效率高,完全满足跨日期同时间段分组号一致的要求。
完整可运行代码
library(data.table) library(lubridate) # 示例数据构造 DT <- data.table(date = c("2019-01-01 00:03:04", "2019-01-01 00:07:03", "2019-01-01 00:15:23", "2019-01-01 00:16:28", "2019-01-01 00:21:30")) # 第一步:将字符串格式的日期转为POSIXct时间格式,仅需转换一次 DT[, date := as.POSIXct(date)] # 第二步:计算15分钟分组号 DT[, date_15min_grp := ceiling(seconds_since_midnight(date) / (15 * 60))] # 查看结果 DT
输出结果验证
运行后得到的结果和需求示例完全一致:
date date_15min_grp 1: 2019-01-01 00:03:04 1 2: 2019-01-01 00:07:03 1 3: 2019-01-01 00:15:23 2 4: 2019-01-01 00:16:28 2 5: 2019-01-01 00:21:30 2
超大数据集优化方案
如果处理千万级以上的超大数据集,想要进一步提升性能,可以跳过lubridate依赖,直接用base R的时间属性提取实现,运算速度会快10%-20%:
DT[, date_15min_grp := { lt = as.POSIXlt(date) ceiling((lt$hour * 60 + lt$min + lt$sec/60)/15) }]
内容的提问来源于stack exchange,提问作者plausibly_exogenous
相关产品推荐
相关产品推荐

