簡體   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