如何在data.table中使用lubridate处理日期?赋值错误求解
搞定你的日期生成问题!
我来帮你排查下代码出错的原因,再给你两种简单有效的解决方案:
为啥你的代码会报错?
你的问题出在对 lubridate::ymd() 函数的用法误解上:
ymd()是用来解析日期格式的字符串的(比如ymd("2017-01-01")),不是用来接收年、月、日三个独立向量的。当你传入三个长度为5的向量时,它会把所有元素拼接成一个15长度的向量(5个年份+5个月份+5个日期),然后尝试逐个解析,这就导致了「15项要分配给5项」的长度不匹配错误。- 同时,这些单独的数字(比如
2017、1)根本不是有效的日期字符串,所以还会抛出「所有格式解析失败」的警告。
两种正确的实现方式
方法1:用 make_date() 构造日期
lubridate 专门提供了 make_date() 函数,用来通过年、月、日的向量生成日期,完全适配你的需求:
library(data.table); library(lubridate); dt <- data.table(date=ymd( paste0("2022-01-", 1:5) ) ) # 生成5年前的对应日期 dt[, `Report date` := make_date(year(date)-5, month(date), day(date))]
方法2:直接对日期做减法(更推荐!)
既然你要的是「原日期减去5年」,直接用 lubridate 的 years() 函数做时间运算就好,代码更简洁直观:
dt[, `Report date` := date - years(5)]
运行结果验证
不管用哪种方法,最终的 dt 都会输出符合预期的结果:
date Report date <Date> <Date> 1: 2022-01-01 2017-01-01 2: 2022-01-02 2017-01-02 3: 2022-01-03 2017-01-03 4: 2022-01-04 2017-01-04 5: 2022-01-05 2017-01-05
内容的提问来源于stack exchange,提问作者IVIM
相关产品推荐
相关产品推荐

