以 yymm 格式向日期添加月份

Add months to a date in format yymm

我正在尝试将指定的月数添加到 yymm 格式的日期。我很难处理 mm 超过 12 的情况。因此,例如:

9109(即 1991 年 9 月)+ 17 个月应该产生 9302。

9103 + 3 个月应该产生 9106

目前,我正在尝试使用模块化算法以 yymm 格式获取额外的月份,但这并不像希望的那样有效。我把17个月换算成0105,但是0105加上9109就变成了9214,这是无意义的。

感谢您的帮助。

这里有几种方法。如果 x 是一个向量,所有这些也都有效。

1) as.yearmon 建议将您的 year/month 数据存储为 yearmon 对象。它们在内部存储为年份 + 分数,其中分数为 0 表示一月,1/12 表示二月,...,11/12 表示十二月,打印时以可识别的形式显示。

请注意,因为如果我们在 2000 年或 2001 年时 x 是数字,则 x 没有 4 位数字,因此如果输入中包含此类日期,我们需要如图所示填零。

将所有内容都保留为 yearmon 对象可能更容易,但如果您希望输出的格式与 x.

相同,则可以将最后一行替换为 as.numeric(format(ym + 17/12, "%y%m"))
library(zoo)

x <- 9109 
ym <- as.yearmon(sprintf("%04f", x), "%y%m")
ym + 17/12
## [1] "Feb 1993"

2) as.POSIXlt 另一种方法是转换为 POSIXlt,然后将月份加 17。这不使用任何包。我们在下面返回了一个字符串,但如果您希望它的形式与 x.

完全相同,您可以使用 as.numeric 将其转换为数字
lt <- as.POSIXlt(sprintf("%04d01", x), format = "%y%m%d")
lt$mon <- lt$mon + 17
format(lt, "%y%m")
## [1] "9302"

3) 模运算 要使用模运算将其转换为月份,加 17 并转换回来。这不使用任何包。

months <- (12 * x %/% 100) + (x %% 100) - 1 + 17
100 * (months %/% 12) + months %% 12 + 1
## [1] 9302

使用seq.Date,只需要基础 R。

我们paste将幻日1转换为日期并转换as.Date,生成长度为m个月的sequence,并将格式化结果转换为as.numeric.

add_months <- function(x, m) {
  as.numeric(
    strftime(seq.Date(as.Date(paste0(9109, 1), "%y%m%d"),
                      by=paste(m, "months"), length.out=2)[2],
             "%y%m")
  )
}

add_months(9109, 17)
# [1] 9302

add_months(9103, 3)
# [1] 9106