Добавить/вычесть 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: не отлаживается, поэтому проверьте его и дайте мне знать.