Rnd*_*mbl 3 time r date lubridate
由于我需要以十进制格式相当准确地表示年份(大约4-5 位精度即可),因此我转向了 lubridate 包。这是我尝试过的:
refDate <- as.Date("2016-01-10")
endDate <- as.Date("2020-12-31")
daysInLeapYear <- 366
daysInRegYear <- 365
leapYearFractStart <- 0
leapYearRegStart <- 0
daysInterval <- as.interval(difftime(endDate, refDate, unit = "d"), start = refDate)
periodObject <- as.period(daysInterval)
if(leap_year(refDate)) {
leapYearFractStart <- (as.numeric(days_in_month(refDate))-as.numeric(format(refDate, "%d")))/daysInLeapYear
}
if(!leap_year(refDate)) {
leapYearRegStart <- (as.numeric(days_in_month(refDate))-as.numeric(format(refDate, "%d")))/daysInRegYear
}
returnData <- periodObject@year+(periodObject@month/12)+leapYearFractStart+leapYearRegStart
Run Code Online (Sandbox Code Playgroud)
可以安全地假设结束日期始终在月底,因此最后没有闰年检查。依靠 lubridate 进行正确的年/月计数,我仅针对开始日期调整闰年。
我认为这只能让我的准确度达到3 位数以内!另外,它看起来有点简陋。
是否有更完整和准确的程序来确定间隔中年份的十进制表示形式?
小智 5
目前还不清楚您到底想在这里做什么,这使得准确性很难谈论。
lubridate有一个将日期转换为小数的函数decimal_date。但由于小数点后 3 位为您提供了一年内 1000 个可能的位置,因此当我们只有 365/366 天时,一天内有 2 到 3 个可行值。准确性取决于您希望结果在一天中的什么时候下降。
> decimal_date(as.POSIXlt("2016-01-10 00:00:01"))
[1] 2016.025
> decimal_date(as.POSIXlt("2016-01-10 12:00:00"))
[1] 2016.026
> decimal_date(as.POSIXlt("2016-01-10 23:59:59"))
[1] 2016.027
Run Code Online (Sandbox Code Playgroud)
换句话说,只有当您对一天中的时间感兴趣时,超过小数点后 3 位才真正重要。