关于持续时间与周期如何在每月添加的润滑剂中起作用的混淆

Ale*_*lex 4 r date lubridate

以下是我认为可能的错误:

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

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

mne*_*nel 8

它不是一个bug,它是一个记录的功能.这绝对不是一个错误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" 
Run Code Online (Sandbox Code Playgroud)

请注意,此功能是在1.2.0版本中引入的,因此未在http://www.jstatsoft.org/v40/i03/paper中记录,因为这是在实现之前编写的

另请注意,您也可以使用 duration(1, 'months')

 d + duration(1, 'months')
 ## [1] "1994-04-30" 
Run Code Online (Sandbox Code Playgroud)