8

关于 R 中日期的快速问题。查看这段代码:

Sys.Date() - months(3)
# [1] "2013-12-31"
Sys.Date() - months(18)
# [1] NA

我已经加载了包lubridate并按照提供的说明进行操作,但我无法完全理解这种行为。它曾经工作得很好,今天是我注意到从今天的日期收益率减去超过 12 个月的第一天NA(减去少于 12 个月的工作正常)。

如果有人能向我解释为什么这不起作用,我将不胜感激,和/或提出一种更“强大”的解决方法。这与今天是本月的最后一天(第 31 天)有关吗?

我问是因为这有效:

Sys.Date() - years(2)
# [1] "2012-03-31"
4

3 回答 3

13

lubridate函数%m+%%m-%旨在处理此问题(“在不超过新月份最后一天的情况下对日期添加和减去月份”)。

library(lubridate)
Sys.Date() %m-% months(18)
# [1] "2012-09-30"

# or to make it reproducible if Sys.Date() happens to be different from that in OP
as.Date("2014-03-31") %m-% months(18)
# [1] "2012-09-30"

# example of %m+%
as.Date("2014-01-31") + months(1)
# [1] NA
as.Date("2014-01-31") %m+% months(1)
# [1] "2014-02-28"
于 2014-03-31T12:46:52.233 回答
1

该解决方案提供准确的远期月份,即 28Feb %m+% 给出 28Mar,如果使用月末数据,这并不理想。

要将顶部调整为始终为您提供该月的最后一天,请使用以下代码:

ceiling_date((as.Date("2014-02-28") %m+% months(1)),"month")-days(1)

> "2014-03-31"
于 2015-11-26T10:01:44.023 回答
0

同样,如果您想增加 3 个月,可以按以下方式进行:

PW_Data_Plan_V1$Month = as.Date(PW_Data_Plan_V1$DOJ) %m+% months(3)
于 2017-05-23T07:47:59.380 回答