繁体   English   中英

R difftime关闭1年

[英]R difftime off by 1 year

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

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。

仔细查看这两个日期,可以确认年差接近但小于45。

年差值应以44开头。

为什么difftime将年份数增加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

由于leap年,一年中平均有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

标准化年

如果您想确切了解leap年,则time1time2之间有12个leap日

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

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

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

注意

请注意, "Date"类没有一个时区, origin只在使用as.Date如果参数为数字,该问题所使用的格式是默认的格式, format是没有必要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM