3

difftime()函数可以很容易地以天或周计算两个日期之间的差异,但没有选项可以计算以月或年为单位的差异。有什么理由吗?您知道任何可以执行此任务的功能吗?

4

2 回答 2

15

来自评论:月和年不是精确的时间单位,也就是说,它们的长度会有所不同(月可以有 28、29、30、31 天。年可以有 365 或 366)。如果您想为这些单位中的一个固定一个值(例如,月 = 30 天,年 = 365 天),您只需将difftimes 以天为单位除以固定值即可获得所需单位的差异。或者,如果您只想要两个日期之间的完整月数,您可以这样做

date1 = as.Date('2012-1-2')
date2 = as.Date('2012-7-5')
length(seq(from=date1, to=date2, by='month')) - 1
# [1] 6

或几周:

length(seq(from=date1, to=date2, by='week')) - 1
# [1] 26
于 2013-10-30T16:05:42.500 回答
4

POSIXltdatetime-class 是一个包含多种提取方法的列表,包括monthsquarter。(该months函数返回一个字符值,因此您需要mon从列表中提取一个整数项目。)如果您想从向量中的连续项目中减去月份值,它将类似于以下内容:

PLvec <- as.POSIXlt(vec)
PLvec[-1]$mon - PLvec[-length(PLvec)]$mon

vec <- seq(from = as.Date('2012-1-2'),
           to = as.Date('2012-7-5'), 
           by="60 days")
 PLvec <- as.POSIXlt(vec)
 PLvec[-1]$mon - PLvec[-length(PLvec)]$mon
#[1] 2 2 1

您应该对 POSIXlt 分类项目进行自我教育,因为它们实际上是列表并且不能很好地与 data.frame 存储配合使用。

dput(as.POSIXlt(Sys.time()))
structure(list(sec = 24.0051879882812, min = 5L, hour = 9L, mday = 30L, 
    mon = 9L, year = 113L, wday = 3L, yday = 302L, isdst = 1L), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst"
), class = c("POSIXlt", "POSIXt"), tzone = c("", "PST", "PDT"
))
于 2013-10-30T16:08:07.483 回答