我想根据参考和测量日期与源半衰期(以年为单位)之间的差异来纠正源活动.说我有
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()
处理所有时间单位长达数周.由于非常数"分子"的相同原因,无法完成月份.
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包的文档可以在这里找到.
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()
会考虑到并非所有月份和年份都具有相同天数的事实,例如闰年。
不是您问题的确切答案,但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)
您可以修改它以计算小数部分,具体取决于您如何定义去年(未完成)的天数。