R语言difftime()函数计算时间间隔结果异常问题排查
日期计算异常的问题原因及解决办法
问题原因
- 日期初始赋值错误:直接用
06/07/2021这种写法,在R中是除法运算,得到的是极小数值(比如6/7/2021≈0.00042),而非日期字符串。后续as.Date转换时,会把这些数值当作1970-01-01起的天数偏移,完全偏离预期日期。 - dplyr管道未赋值:
df %>% mutate(...)执行后未将结果存回df,原df仍是包含除法结果的数值列,后续summarise用的还是错误的原始数据。 - 时间差计算顺序颠倒:
difftime(EARLIEST_DATE, LATEST_DATE)用早日期减晚日期,得到负数间隔,不符合时间长度的正向需求。
解决办法
修正以上三个问题即可,以下是完整修正代码:
# 1. 把日期写成字符串(添加引号) EARLIEST_DATE <- c("06/07/2021", "15/11/2019", "01/10/2019", "24/09/2019", "10/11/2020", "21/09/2021", "21/07/2020", "18/10/2022", "05/10/2021", "22/10/2021") LATEST_DATE <- c("28/09/2021", "20/12/2019", "31/03/2020", "18/09/2020", "15/06/2021", "28/06/2022", "04/09/2020", "28/02/2023", "02/11/2021", "08/07/2022") library(dplyr) df <- data.frame(EARLIEST_DATE, LATEST_DATE) # 2. 将mutate处理后的结果赋值回df(也可直接在管道链中连接summarise) df <- df %>% mutate(EARLIEST_DATE = as.Date(EARLIEST_DATE,'%d/%m/%Y'), LATEST_DATE = as.Date(LATEST_DATE,'%d/%m/%Y')) # 3. 调换difftime的顺序,用晚日期减早日期得到正间隔 df %>% summarise(weeks = ceiling(as.numeric(difftime(LATEST_DATE, EARLIEST_DATE, units = "weeks"))))
执行后会得到符合预期的正数结果,所有间隔均在1年以内。
如果是从CSV导入数据,只要CSV中日期为字符串格式(如"06/07/2021"),则无需处理初始赋值问题,重点关注管道结果赋值和时间差计算顺序即可。
内容的提问来源于stack exchange,提问作者Pendragon
相关产品推荐
相关产品推荐

