这是我认为可能的错误:
require(lubridate)
d = as.Date("1994-03-31")
> d + months(1)
[1] "1994-05-01"
我的理解是这应该返回 1994 年第 4 个月的月底。请告知这是否确实是一个错误。
这不是一个错误,它是一个记录在案的功能。这绝对不是. (编辑。lubridate
as中的错误,months
并且as.Date
都是base
包函数。months.numeric
并且months.integer
都是lubridate
包中不可见的功能。
不过,luibridate
确实有答案!
它完全按照帮助文件中指定的方式进行操作%m+%
(这是lubridate
软件包的一部分。)
添加月份会使基本算术受挫,因为连续的月份有不同的长度。与其他元素一起,有助于算术执行自动翻转。例如,12:00:00 + 61 秒变为 12:01:01。但是,人们通常更喜欢这种行为不会在几个月内发生。例如,我们有时想要 1 月 31 日 + 1 个月 = 2 月 28 日而不是 3 月 3 日。months(n) 总是返回 Date 之后第 n 个月的日期。如果新日期通常会溢出到第 n + 1 个月,月份。日期前 n 个月的日期。
该功能%m+%
旨在确保您想要的功能,确保月份不滚动
d %m+% months(1)
## [1] "1994-04-30"
请注意,此功能是在1.2.0 版本中引入的,因此在http://www.jstatsoft.org/v40/i03/paper中没有记录,因为这是在实现之前编写的
另请注意,您还可以使用 duration(1, 'months')
d + duration(1, 'months')
## [1] "1994-04-30"