4

考えられるバグは次のとおりです。

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

私の理解では、これは1994年の4か月目の終わりに戻るはずです。これが本当にバグであるかどうかをアドバイスしてください。

4

1 に答える 1

8

これはバグではなく、文書化された機能です。両方ともパッケージ関数であるため、これは間違いなくバグではありませlubridatemonthsas.Datebase。(編集します。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" 
于 2013-02-20T23:02:12.493 に答える