考えられるバグは次のとおりです。
require(lubridate)
d = as.Date("1994-03-31")
> d + months(1)
[1] "1994-05-01"
私の理解では、これは1994年の4か月目の終わりに戻るはずです。これが本当にバグであるかどうかをアドバイスしてください。
これはバグではなく、文書化された機能です。両方ともパッケージ関数であるため、これは間違いなくバグではありませ。(編集します。lubridate
んmonths
。as.Date
base
months.numeric
両方ともパッケージmonths.integer
の非表示関数です。lubridate
しかし、luibridate
答えはあります!
(パッケージ%m+%
の一部である)のヘルプファイルで指定されているとおりに実行されます。lubridate
月を追加すると、連続する月の長さが異なるため、基本的な算術が不満になります。他の要素では、算術演算で自動ロールオーバーを実行すると便利です。たとえば、12:00:00+61秒は12:01:01になります。しかし、人々はしばしばこの行動が数ヶ月で起こらないことを好みます。たとえば、3月3日ではなく1月31日+1か月=2月28日が必要な場合があります。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"