data.table修改日期列时如何保留日期格式,避免转为数值类型?
问题根源
你遇到的日期格式丢失问题是R基础函数ifelse()的固有特性:该函数执行时会剥离向量的自定义类属性,把Date类型直接转换为底层存储的数值(即1970-01-01到对应日期的天数)。后续转日期结果错误是因为转回Date类型时没有指定正确的origin参数。
最优解决方案(data.table原生风格,效率最高)
直接用data.table的行筛选语法更新符合条件的行,不会修改其他行的属性,天然保留Date格式:
sample[SHIPMENT_DATE == ORDER_DATE, SHIPMENT_DATE := SHIPMENT_DATE - 1]
替代方案(类ifelse逻辑)
如果需要写分支判断逻辑,可以用data.table自带的类型安全判断函数fifelse(),它会保留输入向量的类属性:
sample[, SHIPMENT_DATE := fifelse(SHIPMENT_DATE == ORDER_DATE, SHIPMENT_DATE - 1, SHIPMENT_DATE)]
错误补救方案
如果你的列已经被转为数值类型,可以通过指定正确origin的方式转回日期:
sample[, SHIPMENT_DATE := as.Date(SHIPMENT_DATE, origin = "1970-01-01")]
运行上述任意正确方案后,可验证列类型:
class(sample$SHIPMENT_DATE) # 输出为 "Date",计算结果符合预期
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

