以下是我认为可能存在的错误:
require(lubridate)
d = as.Date("1994-03-31")
> d + months(1)
[1] "1994-05-01"
我的理解是,这应该会在1994年4月底返回。请告知这是否确实是一个错误。
答案 0 :(得分:8)
这不是一个错误,它是一个记录在案的功能。 绝对不是。 (编辑。lubridate
中的错误
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日。月(n)始终返回日期后第n个月的日期。如果新的日期通常会溢出到第n + 1个月,那个月。日期前n个月的日期。
功能%m+%
旨在确保您想要的功能,确保月份不会延期
d %m+% months(1)
## [1] "1994-04-30"
请注意,此功能是在version 1.2.0中引入的,因此未在http://www.jstatsoft.org/v40/i03/paper中记录,因为这是在实施之前编写的
另请注意,您也可以使用duration(1, 'months')
d + duration(1, 'months')
## [1] "1994-04-30"