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

处理超24小时的时间格式并做运算时data.table条件赋值报错问题

报错原因

你遇到的报错是data.table子集赋值逻辑和lubridate::Period类(hms()返回的对象类型)的兼容性问题:当你在[i]位置添加筛选条件后,j位置直接执行hmstime + addingtime返回的是全表长度的Period向量,和筛选后需要赋值的子集行数长度不匹配,进而触发报错。
你的初始实现思路没有问题,lubridate::hms确实是处理超24小时时长类数据的最优选择,报错不是实现思路错误导致的。

可行解决方法

方法1:使用条件判断全量赋值(最便捷)

直接用data.table自带的fifelse做全量条件计算,长度和全表行数完全匹配,不会出现适配问题:

foo[, test2 := fifelse(hmstime < testingtime, hmstime + addingtime, as.period(NA))]

方法2:转数值型秒数运算(性能最优、兼容性最好)

如果处理数据量较大,建议先把时间统一转为总秒数的数值格式做运算,需要展示时再转回hms格式,完全规避S3类的适配问题:

# 预处理转为数值秒数
testingtime_sec <- as.numeric(testingtime)
addingtime_sec <- as.numeric(addingtime)
foo[, hmstime_sec := as.numeric(hmstime)]

# 条件赋值无任何兼容问题
foo[hmstime_sec < testingtime_sec, test2 := hms(hmstime_sec + addingtime_sec)]

方法3:子集内取对应列运算

如果一定要在子集赋值逻辑里直接操作Period类,可在j位置明确取子集内的列做计算:

foo[hmstime < testingtime, test2 := hmstime[.I] + addingtime]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:45:04