11

如何将以下产品(单位为天)准确转换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

4 回答 4

6

如果你正在做类似的事情

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(.)返回月份的字符表示,因此可能效率不高。至少,它需要一些处理(不太难)来给出数字表示。

于 2012-05-31T18:12:08.187 回答
0

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

您需要知道开始日期或结束日期才能准确判断月数。

然后,您可以计算时间跨度第一年的月数、时间跨度的最后一年的月数,并在 12 次之间加上年数。

于 2012-05-31T15:29:18.097 回答
0

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

换句话说,不要使用 difftime 的乘积,而是重新编码你自己的 difftime。

于 2012-05-31T15:32:10.953 回答
0

R has not implemented these features out of ignorance. difftime objects are transitive. A 700 day difference on any arbitrary start-date can yield a differing number of years depending on whether there was a leap year or not. Similarly for months, they take between 28-31 days. For research purposes, we use these units a lot (months and years) and pragmatically, we define a month as 30.5 days and a year as 365.25 days. You must convert this value to numeric so R stops spouting off the units.

于 2018-05-24T17:29:43.453 回答