我正在尝试将指定的月数添加到yymm
格式化日期。我很难处理 mm 超过 12 的情况。例如:
9109(即 1991 年至 9 月)+ 17 个月应产生 9302。
9103 + 3 个月应该会产生 9106
目前,我正在尝试使用模运算来获得 yymm 格式的额外月份,但这并不像希望的那样工作。我将 17 个月转换为 0105,但将 0105 添加到 9109 会导致 9214,这是无意义的。
感谢您的任何帮助。
使用seq.Date
,只需要基数 R。
我们paste
将幻日1
转换为日期并转换as.Date
,生成seq
长度为 m 个月的 uence,并将格式化的结果转换为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
这里有几种方法。如果 x 是一个向量,所有这些也都有效。
1) as.yearmon建议将年/月数据存储为 yearmon 对象。它们在内部存储为年 + 分数,其中分数为 0 表示 1 月,1/12 表示 2 月,...,11/12 表示 12 月,并且当以可识别的形式打印显示时。
请注意,如果我们在 2000 年或 2001 年,x 是数字,那么 x 没有 4 位数字,因此如果输入中有这样的日期,我们需要填零,如图所示。
将所有内容保留为 yearmon 对象可能更容易,但as.numeric(format(ym + 17/12, "%y%m"))
如果您希望输出格式与x
.
library(zoo)
x <- 9109
ym <- as.yearmon(sprintf("%04f", x), "%y%m")
ym + 17/12
## [1] "Feb 1993"
2) as.POSIXlt 另一种方法是转换为 POSIXlt 然后将 17 添加到月份。这不使用任何包。我们在下面返回了一个字符串,但as.numeric
如果您希望它的格式与x
.
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