lubridate 中的 months() 运算符产生 NA

months() operator in lubridate produces NA

以下 R 行为令我困惑:

> EndDate<-as.Date("2016-03-31")
> EndDate-months(2)
[1] "2016-01-31"

> EndDate<-as.Date("2016-04-30")
> EndDate-months(2)
[1] NA

为什么第一个有效而第二个无效?

这是故意的。

您可以通读lubridate documentation

具体来说,你可以这样做:

EndDate%m-%months(2)
[1] "2016-02-29"

这将执行减法并在减法导致非实际日期的情况下自动将日期回滚到第一个 'real date'。

请注意,如果您想前滚,则需要做更多的工作(据我所知,我希望有一个像 %m-f% 或其他一些简单的运算符已经存在的 %m-% 的推导)。但是这样的事情会起作用:

EndDate%m-%months(2) + if(is.na(EndDate-months(2))) {days(1)} else {0}
"2016-03-01"