我正试图在现有的日期基础上再增加15个月。然而,这是不合适的月底,这是预期的使用%m+%在润滑油。
> as.Date("2018-04-30") %m+% months(15)
[1] "2019-07-30"发布于 2019-11-26 19:55:40
%m+%只是简单地添加月份,在任何时候都没有假设它将保持“月的最后一天”状态。正如@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"也许还有更多的组合。
发布于 2019-11-26 21:00:36
您可以在动物园包中使用yearmon类。我认为为此目的考虑比lubridate函数看起来更好。您不需要单独计算额外的天数。注意,月份的加法需要以年份为单位,所以将月份除以12个月。frac=1作为as.Date.yearmon的参数返回月份的最后一天:
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" Successhttps://stackoverflow.com/questions/59058335
复制相似问题