0

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

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

9103 + 3 个月应该会产生 9106

目前,我正在尝试使用模运算来获得 yymm 格式的额外月份,但这并不像希望的那样工作。我将 17 个月转换为 0105,但将 0105 添加到 9109 会导致 9214,这是无意义的。

感谢您的任何帮助。

4

2 回答 2

0

使用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
于 2021-03-01T15:31:09.213 回答
0

这里有几种方法。如果 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
于 2021-03-01T15:10:18.180 回答