按ID将数据匹配到最近小时时间戳并保留amount属性的实现方法
按ID匹配最近小时时间戳的data.table解决方案
我来帮你搞定这个按ID匹配最近小时时间戳的需求,用data.table可以高效实现,步骤如下:
1. 先处理时间格式一致性
首先得确保你的test数据集里的time列和intervals是同一种时间类型(POSIXct)且时区一致,不然匹配会出错:
library(data.table) # 把test转成data.table,同时将字符型time转为POSIXct,时区和intervals保持一致 test <- setDT(test)[, time := as.POSIXct(time, tz = "America/Los_Angeles")]
2. 把参考时间戳转成data.table
我们需要把预先生成的intervals序列包装成data.table,方便后续连接操作:
intervals_dt <- data.table(interval = intervals)
3. 执行最近时间匹配
用data.table的非等值连接+roll = "nearest"参数,就能快速给每条test记录匹配到最近的小时时间戳,同时保留id和amount:
output <- intervals_dt[test, .(interval, id = i.id, amount = i.amount), roll = "nearest", on = c("interval" = "time")]
代码说明
on = c("interval" = "time"):指定用参考表的interval列和test表的time列做匹配依据roll = "nearest":核心参数,让data.table自动找到距离当前时间最近的那个小时戳i.id和i.amount:因为我们是用intervals_dt[test, ...]的语法,i.前缀表示取test表(也就是i表)里的对应列,避免列名冲突
举个例子,你test里那条2018-01-20 00:02:14 PST的记录,会被匹配到最近的2018-01-20 00:00:00 PST,输出结果里就会保留对应的id和amount,和你期望的格式完全一致。
内容的提问来源于stack exchange,提问作者iskandarblue
相关产品推荐
相关产品推荐

