【问题标题】:R difftime off by 1 yearR difftime 关闭 1 年
【发布时间】:2018-03-13 13:34:12
【问题描述】:

我正在尝试计算两个日期之间的年差。

time1 <- as.Date(x = "2017-02-14",
                 format = "%Y-%m-%d",
                 origin = "",
                 tz = "")

time2 <- as.Date(x = "1972-02-17",
                 format = "%Y-%m-%d",
                 origin = "",
                 tz = "")

as.integer(x = difftime(time1 = time1,
                        time2 = time2,
                        tz = "",
                        units = "days")) / 365

根据上面的代码,年差约为45.02466。

看一眼这 2 个日期就可以确认,年差接近但小于 45。

年差值应以 44 开头。

为什么difftime 将年数增加了 1?

【问题讨论】:

标签: r


【解决方案1】:

这可能是因为您除以 365 天,而至少 44/4 = 11 年的持续时间为 366 天。您可以考虑除以 365.25,这是更正确的一年平均持续时间。

另外,您可能想查看 lubridate 包以查看两个日期之间的间隔时间

library(lubridate)
> time1 <- as.Date(x = "2017-02-14",
+                  format = "%Y-%m-%d",
+                  origin = "",
+                  tz = "")
> 
> time2 <- as.Date(x = "1972-02-17",
+                  format = "%Y-%m-%d",
+                  origin = "",
+                  tz = "")
> 
> 
> interval(time2, time1) %/% years(1)
[1] 44

【讨论】:

  • 还有:as.numeric(as.duration(interval(time2, time1)), unit="years")
【解决方案2】:

由于闰年,一年平均有 365.25 天 - 如果年数不是 4 的倍数,可能会略有不同,但这是一个合理的长期平均值。通过使用 365 代替,这夸大了问题中的答案。

time1 <- as.Date("2017-02-14")
time2 <- as.Date("1972-02-17")
as.numeric(time1 - time2) / 365.25
## [1] 44.99384

标准化年份

如果您想准确了解闰年,time1time2 之间有 12 个闰日

tt <- seq(time2, time1, by = "day")
no_leap_days <- sum(format(tt, "%m-%d") == "02-29")
no_leap_days
## [1] 12

所以另一种方法是计算两个日期之间的天数,将每年有效标准化的闰日数减去 365 天,然后除以 365:

as.numeric(time1 - time2 - no_leap_days) / 365
## [1] 44.99178

注意

请注意"Date" 类没有时区,origin 仅在参数为数字且问题中使用的格式为默认格式的情况下用于as.Date,因此不需要format

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-14
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多