以 yymm

问题描述

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

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

9103 + 3 个月应该产生 9106

目前,我正在尝试使用模算术来获得 yymm 格式的额外月份,但这并没有达到预期的效果。我将 17 个月转换为 0105,但是将 0105 与 9109 相加会导致 9214,这是无意义的。

感谢您的帮助。

解决方法

这里有几种方法。如果 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",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,并将格式化结果转换为 {{1 }}。

as.numeric