以年为单位获取日期差异(浮点数)

moa*_*eep 26 r date

我想根据参考和测量日期与源半衰期(以年为单位)之间的差异来纠正源活动.说我有

ref_date <- as.Date('06/01/08',format='%d/%m/%y')
Run Code Online (Sandbox Code Playgroud)

和我的一个列data.frame具有相同的日期格式,例如,

today <- as.Date(Sys.Date(), format='%d/%m/%y')
Run Code Online (Sandbox Code Playgroud)

我可以使用lubridate包找到这些日期之间的年数

year(today)-year(ref_date)
[1] 5
Run Code Online (Sandbox Code Playgroud)

例如,我可以使用一个函数来获得浮点答案today - ref_date= 5.2y吗?

Dir*_*tel 37

是的,当然,使用difftime()as数字:

R> as.numeric(difftime(as.Date("2003-04-05"), as.Date("2001-01-01"), 
+                      unit="weeks"))/52.25
[1] 2.2529
R> 
Run Code Online (Sandbox Code Playgroud)

请注意,我们必须切换到52.25缩放的周数,因为在计算年数方面存在一些模糊性 - 2月29日每4年左右出现一次,但不是每100次出现一次.

所以你必须定义它.difftime()处理所有时间单位长达数周.由于非常数"分子"的相同原因,无法完成月份.

  • 有人应该将`unit ="years"添加到difftime. (33认同)
  • 52.25*7=365.75,这样可以吗?维基说公历日历有365.2425天... 365.2425/7=52.1775,怎么做才对? (2认同)

Bry*_*n F 17

lubridate包中包含一个内置的功能,TIME_LENGTH,它可以帮助执行此任务.

time_length(difftime(as.Date("2003-04-05"), as.Date("2001-01-01")), "years")
[1] 2.257534

time_length(difftime(as.Date("2017-03-01"), as.Date("2012-03-01")),"years")
[1] 5.00274
Run Code Online (Sandbox Code Playgroud)

有关lubridate包的文档可以在这里找到.

  • 请注意下面@RenMa 的回答,因为使用 difftime() 确实会给出不正确的结果。在查看 1948-12-07 和今天 (2018-11-29) 之间的差异时,我碰巧注意到了这一点,差异是 70.02466 通过 difftime() 和 69.97808 通过 interval()。开始 &lt;- as.Date("1948-12-07"); 结束 &lt;- as.Date("2018-11-29"); difftime(end, start) %&gt;% time_length(unit = "years"); 间隔(开始,结束)%&gt;% time_length(单位=“年”) (2认同)

Ren*_* Ma 17

Bryan F 的启发,time_length()如果使用间隔对象会更好

time_length(interval(as.Date("2003-04-05"), as.Date("2001-01-01")), "years")
[1] -2.257534
time_length(difftime(as.Date("2017-03-01"), as.Date("2012-03-01")),"years")
[1] 5.00274
time_length(interval(as.Date("2017-03-01"), as.Date("2012-03-01")),"years")
[1] -5
Run Code Online (Sandbox Code Playgroud)

您可以查看是否interval()用于获取时差,然后将其传递给time_length(),time_length()会考虑到并非所有月份和年份都具有相同天数的事实,例如闰年。

  • `interval(start_date, end_date)` 基本上使用 end_date 减去 start_date。因此,如果您的开始日期发生在结束日期之后,则间隔将为负数。 (2认同)

Rom*_*siv 6

不是您问题的确切答案,但Dirk Eddelbuettel的答案在某些情况下可能会产生小错误。

请考虑以下示例:

as.numeric(difftime(as.Date("2012-03-01"), as.Date("2017-03-01"), unit="weeks"))/52.25
[1] -4.992481
Run Code Online (Sandbox Code Playgroud)

这里的正确答案应该是至少5年。

以下函数(使用lubridate包)将计算两个日期之间的整年数:

# Function to calculate an exact full number of years between two dates
year.diff <- function(firstDate, secondDate) {
  yearsdiff <- year(secondDate) - year(firstDate)
  monthsdiff <- month(secondDate) - month(firstDate)
  daysdiff <- day(secondDate) - day(firstDate)

  if ((monthsdiff < 0) | (monthsdiff == 0 & daysdiff < 0)) {
    yearsdiff <- yearsdiff - 1
  }

  yearsdiff
}
Run Code Online (Sandbox Code Playgroud)

您可以修改它以计算小数部分,具体取决于您如何定义去年(未完成)的天数。