You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并不同长度的R data.table:将小时数据行重复关联15分钟数据

合并小时粒度与15分钟粒度data.table的实现方法

问题背景

现有两个不同时间粒度的data.table:

  • d1是小时粒度数据,每条记录对应一个整点,包含时间戳ts_hr和变量var1_hr、var2_hr
  • d2是15分钟粒度数据,每条记录对应15分钟间隔的时间点,包含时间戳ts_15和变量var_15

需求是把d1的每小时数据对应到d2中该小时的4个15分钟记录上,让d2新增var1_hr和var2_hr两列。


两种实现方案

方案一:先扩展d1再合并

先把d1的每行重复4次(对应1小时内的4个15分钟区间),生成匹配d2的15分钟时间戳后再合并:

# 扩展d1,每行重复4次
d1_expanded <- d1[rep(1:.N, each = 4)]
# 给扩展后的d1生成对应15分钟的时间戳
d1_expanded[, ts_15 := ts_hr + lubridate::minutes(c(0, 15, 30, 45))]
# 按时间戳合并d2和扩展后的d1
d2_merged <- merge(d2, d1_expanded, by = "ts_15", all.x = TRUE)

方案二:按小时时间对齐合并(推荐,效率更高)

不需要提前扩展d1,直接把d2的时间戳截断到小时级别,再和d1按小时时间戳匹配,自动完成数据映射:

# 给d2添加小时粒度的时间戳列(用lubridate截断时间)
d2[, ts_hr := lubridate::floor_date(ts_15, "hour")]
# 按小时时间戳合并两个表
d2_merged <- merge(d2, d1, by = "ts_hr", all.x = TRUE)
# 可选:删除临时生成的ts_hr列
d2_merged[, ts_hr := NULL]

如果不想依赖lubridate包,也可以用base R实现时间截断:

d2[, ts_hr := as.POSIXct(trunc(ts_15, "hour"))]

方案二无需扩展数据,对于大数据集来说内存占用更低、运行更快,是这类时间粒度对齐场景的最优解。


内容的提问来源于stack exchange,提问作者JerryN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:55:29