如何准确地将以下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日那么这将被视为一个月?
当我写这个问题时,问题本身就会发展,所以我最好澄清一下:
定义月份的最佳(最合理的方法)是什么,然后如何找到年,月和日的差异时间?
答案 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停止向单位喷射。