使用Lubridate
包,如何确定两次之间的数字年龄,计算闰年。
我需要一个功能,用户可以指定年龄是否适用于所有不同的单位,例如'毫秒'秒'分钟'分钟&# 39;'周''个月'和'年'。
以下是我到目前为止的例证:
age <- function(from, to = today(), units = "years", floor = FALSE) {
calc = interval(from,to) / duration(num = 1, units = units)
if (floor) calc = as.integer(floor(calc))
calc
}
2016年是闰年,让我们确定6月份开始和结束时间之间的年龄。应该是30天。
require(lubridate)
#Consider month of June 2016, known to have 30 days
from = as.POSIXct("2016-6-1")
to = from + months(1)
daysInYear = 365 + leap_year(to)
age(from,to,units='days') #30.00, CORRECT
age(from,to,units='years')*daysInYear #30.08, INCORRECT
age(from,to,units='years')*365 #30.00, CORRECT ANSWER, WRONG DAYS IN YEAR
如果我在&#39;年中计算相同的间隔,则返回:0.08219178
,这是不正确的,因为年龄函数中的持续时间除数不是2016年的闰年,我需要它来计算0.08196721
,这是相同的值乘以(365/366)。
是否有更简单的方法来确定两个日期之间的确切数字年龄,考虑闰年,并允许完整规定间隔单位?
答案 0 :(得分:0)
is.leapyear=function(year){
#http://en.wikipedia.org/wiki/Leap_year
return(((year %% 4 == 0) & (year %% 100 != 0)) | (year %% 400 == 0))
}
age.hackr <-
function(from, to = today(), units = "years", floor = FALSE) {
if(is.leapyear(year(to))){
calc = interval(from,to) / duration(num = 1, units = units)
if (floor) calc = as.integer(floor(calc))
calc <- calc - 0.00022457
calc
} else{
calc = interval(from,to) / duration(num = 1, units = units)
if (floor) calc = as.integer(floor(calc))
calc
}
}
age.hackr(from, to, units = "years") * 366
[1] 30