将difftime时间转换为年,月和日

Tyl*_*ker 11 r

如何准确地将以下产品(单位为天)转换difftime为年,月和日?

difftime(Sys.time(),"1931-04-10")
difftime(Sys.time(),"2012-04-10")
Run Code Online (Sandbox Code Playgroud)

这需要多年和几天,但我怎么能包括几个月?

yd.conv<-function(days, print=TRUE){
    x<-days*0.00273790700698851
    x2<-floor(x)
    x3<-x-x2
    x4<-floor(x3*365.25)
    if (print) cat(x2,"years &",x4,"days\n")
    invisible(c(x2, x4))
}

yd.conv(difftime(Sys.time(),"1931-04-10"))
yd.conv(difftime(Sys.time(),"2012-04-10"))
Run Code Online (Sandbox Code Playgroud)

我也不确定如何定义月份.将4个星期视为一个月或同一个月的过去.因此,对于一个月的后期定义,如果初始日期是2012-01-10和当前的2012-05-31那么我们将有0年,5个月和21天.这样做效果不错,但如果原始日期是在该月的31日,而结束日期是在2月28日那么这将被视为一个月?

当我写这个问题时,问题本身就发生了变化,所以我最好澄清一下:

定义几个月然后如何在几年,几个月和几天找到差异时间的最佳(最合乎逻辑的方法)是什么?

Bry*_*ich 5

如果你正在做类似的事情

difftime(Sys.time(), someDate)
Run Code Online (Sandbox Code Playgroud)

暗示你必须知道someDate是什么.在这种情况下,您可以将其转换为POSIXct类对象,使您能够直接提取时态信息(包chron也提供更多方法).例如

as.POSIXct(c(difftime(Sys.time(), someDate, units = "sec")), origin = someDate)
Run Code Online (Sandbox Code Playgroud)

这将返回您想要的日期对象.如果你有一个时区tz来提供difftime,你也可以直接将它传递给as.POSIXct中的tz参数.

现在你有了你的日期对象,你可以运行类似的东西months(.),如果你有chron,你可以做(years(.)days(.)返回有序因子).

从这里开始,您可以分别对年,月和日的差异进行更简单的数学计算(转换为适当的数字表示).当然,将someDate转换为POSIXct是必需的.

编辑:第二个想法,months(.)返回一个月的字符表示,因此可能效率不高.至少,它需要一点处理(不太难)来给出数字表示.