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

时间:2012-05-31 15:23:15

标签: r

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

difftime(Sys.time(),"1931-04-10")
difftime(Sys.time(),"2012-04-10")

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

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"))

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

当我写这个问题时,问题本身就会发展,所以我最好澄清一下:

定义月份的最佳(最合理的方法)是什么,然后如何找到年,月和日的差异时间?

4 个答案:

答案 0 :(得分:5)

如果您正在做类似

的事情
difftime(Sys.time(), someDate)

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

as.POSIXct(c(difftime(Sys.time(), someDate, units = "sec")), origin = someDate)

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

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

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

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

答案 1 :(得分:0)

你不能简单地将difftime转换为月份,因为月份的定义取决于difftime开始的绝对时间。

您需要知道开始日期或结束日期,以准确说明月数。

然后,您可以,例如,计算您的时间跨度的第一年中的月数,最后一个时间段中的月份数,以及在12次之间添加年数。

答案 2 :(得分:0)

嗯。我认为最明智的做法是看看各个单位本身。因此,首先比较当月的日期,然后比较一年中的月份,然后比较年份。在每一点上,您都可以引入一个进位以避免负值。

换句话说,不要使用difftime的产品,而是重新编写自己的difftime。

答案 3 :(得分:0)

R没有通过无知实现这些功能。 difftime个对象是可传递的。任意开始日期的700天差异可以产生不同的年数,具体取决于是否存在闰年。同样数月,他们需要28-31天。出于研究目的,我们使用这些单位(数月和数年)并且实际上,我们将月份定义为30.5天,将一年定义为365.25天。您必须将此值转换为数字,以便R停止向单位喷射。