以 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个月的seq
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
我正在尝试将指定的月数添加到 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个月的seq
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