【问题标题】:Is it possible to count the distance between two dates in months or years?是否可以以月或年计算两个日期之间的距离?
【发布时间】:2013-11-10 07:50:11
【问题描述】:

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

【问题讨论】:

  • 你能解释一下“月差”吗?
  • 问题是月份和年份都没有固定的长度。
  • 月和年不是精确的时间单位,也就是说,它们的长度会有所不同。如果您想为它们固定一个值,例如,月 = 30 天,年 = 365 天,您可以将您的差异除以天数以获得您想要的单位。或者你只想要两个日期之间的完整月数,`length(seq(from=date1, to=date2, by='month')) - 1`

标签: r date


【解决方案1】:

POSIXlt 日期时间类是一个包含多种提取方法的列表,包括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"
))

【讨论】:

  • 如果您将代码包装在一个函数中,您可以将 data.frame 列保留为POSIXct。我尽量避免存储POSIXlt 数据。
  • 我只使用 POSIXlt 进行输出。我建议不要使用 data.frame 存储。
【解决方案2】:

来自 cmets: 月和年不是精确的时间单位,也就是说,它们的长度各不相同(月可以有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多