web-dev-qa-db-ja.com

ルブリデートを使用してRで6か月(結合時間)を加算/減算

lubridateを使用して、6か月を確実に加算および減算したいと考えています。

たとえば、_12/31/2014_に6か月追加すると_6/30/2015_になり、_2/28/2014_に追加すると_8/31/2014_になります

as.Date("2014-12-31") + months(6)の問題は、NAが生成されることです。または、2番目の結果は2014年8月28日です。これは、月に6か月を追加するだけでなく、その月に応じて1日の最終的な位置がわかるためです。

これをすばやく修正する方法はありますか?現在は基本的にスイッチを使って毎月検討する機能を構築していますが、これは非常に長く問題も抱えています。

ありがとう!

22
Michael Clinton

lubridate関数%m+%はここで役に立ちます:

新しい月の最終日を超えずに日付に月を加算および減算する

as.Date("2014-12-31") %m+% months(6)
# [1] "2015-06-30"

2番目のケースも処理するには、ceiling_dateを使用して最も近い月に切り上げ、daysを使用して1日を減算する必要があります。

ceiling_date(as.Date("2014-02-28") %m+% months(6), unit = "month") - days(1)
# [1] "2014-08-31"
59
Henrik

私はこれをすばやくコーディングしましたが、うまくいくはずです。しかし、それが最もエレガントなソリューションであるかどうかはわかりません。

# up = 1, down = -1
six.mo.mover<-function(date,up.or.down) {
  last.day <- month(date) != month(as.Date(date)+1) 
  if(last.day) {
    adj.date <- as.Date(date) - day(as.Date(date)-1) + up.or.down*months(6)
    adj.mo <- month(adj.date)
    if (adj.mo == 2) {
      dy <- 28 + leap_year(year(adj.date))
    }
    else {
      dy <- 31-(adj.mo-1)%%7%%2
    }
    adj.date + days(dy-1)
  } 
  else {
    as.Date(date)+up.or.down*months(6)
  }
}

注:デバッグされていないので、自分で確認してお知らせください。

2
Jacob M. Morley