4

这是我认为可能的错误:

require(lubridate)
d = as.Date("1994-03-31")
> d + months(1)
  [1] "1994-05-01"

我的理解是这应该返回 1994 年第 4 个月的月底。请告知这是否确实是一个错误。

4

1 回答 1

8

这不是一个错误,它是一个记录在案的功能。这绝对不是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" 
于 2013-02-20T23:02:12.493 回答