在 R 中正确添加月份

adding months properly in R

我正在尝试将现有日期增加 15 个月。然而,结果不是正确的月末,预计在 lubridate 中使用 %m+%。

> as.Date("2018-04-30") %m+% months(15)
[1] "2019-07-30"

%m+% 只是添加月份,在任何时候都不会假设它将保持 "last day of the month" 状态。正如@duckmayr 简洁地指出的那样,它可以防止超过月底,但我认为 推断 应该相应地推出它不应该是一个安全的假设。

备选方案:

rollback(as.Date("2018-04-30") %m+% months(15+1))
# [1] "2019-07-31"

ceiling_date(as.Date("2018-04-30") %m+% months(15), unit="month") - 1
# [1] "2019-07-31"

ceiling_date(as.Date("2018-04-30") %m+% months(15), unit="month") %m+% days(-1)
# [1] "2019-07-31"

也许还有一些进一步的组合。

您可以使用 zoo 包中的 yearmon class。我认为为此目的设计比 lubridate 函数看起来更好。您不需要单独计算额外的天数。请注意,月份的加法需要以年为单位,因此将月份除以 12。frac=1 作为 as.Date.yearmon returns 月份最后一天的参数:

library(zoo)
as.Date( as.yearmon( as.Date("2018-04-30") ) +15 , frac=1)
[1] "2033-04-30"    Wrong!!!
# Divided months by 12
as.Date( as.yearmon( as.Date("2018-04-30") ) +15/12 , frac=1)
[1] "2019-07-31"   Success