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

使用R的lubridate包计算日期间隔天数异常求助

解决lubridate计算日期间隔天数的异常问题

我用R的lubridate包计算两个日期的间隔天数时遇到问题:

先运行了这段代码:

tbls_data_new1<- tbls_data_new %>% mutate(days = interval(end,start),
                                    days = as.period(days) ) 

代码能正常运行,得到年-月-日格式的间隔结果,但尝试转成天数时,出现了-358084800d 0H 0M 0S这类异常值。

以下是可复现的数据结构:

structure(list(name_birtha_death = c("Toussaint Louverture(1743-1803)", 
"Jean-Jacques Dessalines(1758-1806)", "Henri Christophe(1767-1820)", 
"Alexandre Pétion(1770-1818)", "Jean-Pierre Boyer(1776-1850)", 
"Jean-Pierre Boyer(1776-1850)"), start = structure(c(-65378, 
-60631, -59611, -59611, -55429, -54496), class = "Date"), end = structure(c(-61236, 
-60366, -57988, -55430, -54496, -46343), class = "Date"), days = new("Period", 
    .Data = c(0, 0, 0, 0, 0, 0), year = c(-11, 0, -4, -11, -2, 
    -22, -1, 0, 0, 0, -2, -8, 0, -2, -4, -1, -3, 0, -8, 0, 0, 
    0, -6, -6, 0, -5, -2, 0, 0, 0, 0, 0, 0, -6, -8, 0, -10, -4, 
    0, -3, 0, -6, 0, 0, 0, 0, -13, -14, -2, 0, 0, -1, 0, 0, 0, 
    -1, -1, -5, -3, -2, -5, -5, -4, 0, -4), month = c(-4, -8, 
    -5, -5, -6, -3, 0, -11, -11, -11, -5, -1, -1, -7, -4, -10, 
    -2, -2, -10, -2, -10, -1, -5, -1, -6, -11, -7, -11, -8, -8, 
    -8, -3, -5, -9, 0, -6, -5, -7, -7, -8, -6, 0, -1, -1, 0, 
    -4, -5, -9, 0, -4, -2, -5, -10, -7, -8, -3, -3, 0, 0, -2, 
    0, 0, -8, -11, -5), day = c(-5, -21, -11, -12, -19, -26, 
    -29, -12, -8, -4, -24, -22, -13, -23, -18, -1, -24, -7, -8, 
    -6, -7, -25, -7, -12, -22, -12, -28, -24, -25, -15, -21, 
    -15, -3, -3, 0, -3, -27, -27, -5, -25, -27, -6, -22, -23, 
    -20, -8, -30, -16, 0, -13, -27, -23, -25, -22, -11, -27, 
    -26, 0, -22, -14, 0, 0, -24, -22, 0), hour = c(0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0), minute = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x000001fea26b1ef0>)

解决方法

问题出在as.period()生成的Period对象,它是按年、月、日拆分的间隔,这类对象直接转天数会因为日期规则(不同月份天数不同、闰年等)以及早期日期的数值存储问题出现异常。推荐两种简单直接的方式:

方法1:直接计算日期差

Date类型本质是从1970-01-01开始的天数数值,直接相减后转成数值即可得到准确天数:

tbls_data_new1 <- tbls_data_new %>% 
  mutate(days = as.numeric(end - start))

方法2:用lubridate的time_length()处理间隔

如果需要保留interval步骤,用time_length()指定单位提取天数,注意调整interval的顺序(start在前,end在后得到正间隔):

tbls_data_new1 <- tbls_data_new %>% 
  mutate(days = interval(start, end),
         days = time_length(days, unit = "days"))

两种方法都能得到正确的天数结果,比如第一条数据的天数应为4142(-61236 - (-65378) = 4142)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:09:27