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日の最終的な位置がわかるためです。
これをすばやく修正する方法はありますか?現在は基本的にスイッチを使って毎月検討する機能を構築していますが、これは非常に長く問題も抱えています。
ありがとう!
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"
私はこれをすばやくコーディングしましたが、うまくいくはずです。しかし、それが最もエレガントなソリューションであるかどうかはわかりません。
# 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)
}
}
注:デバッグされていないので、自分で確認してお知らせください。