Добавить/вычесть 6 месяцев (время связывания) в R, используя лубридат

Я lubridate добавить и вычесть шесть месяцев надежно с lubridate.

Например, добавление шести месяцев до 12/31/2014 должны привести к 6/30/2015, и добавление к 2/28/2014 должны привести к 8/31/2014

Проблема с as.Date("2014-12-31") + months(6) заключается в том, что он дает NA. Кроме того, второй результат - 28.08.2014, потому что он не просто добавляет 6 месяцев к месяцу, а затем знает, где день должен закончиться, в зависимости от месяца.

Есть ли способ быстро исправить это? В данный момент я создаю функцию, которая в основном использует переключатель и учитывает каждый месяц, но это очень долго, и у меня тоже есть проблемы с ним.

Спасибо!

Ответы

Ответ 1

Функция lubridate %m+% может быть полезна здесь:

Добавить и вычесть месяцы до даты, не превышающей последний день нового месяца

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

Чтобы также обрабатывать второй случай, вам нужно округлить до ближайшего месяца, используя ceiling_date, и вычесть один день с помощью days.

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

Ответ 2

Я просто закодировал это быстро, но я думаю, что он должен работать. Однако я не уверен, что это самое элегантное решение.

# 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)
  }
}

NB: не отлаживается, поэтому проверьте его и дайте мне знать.