Подтвердить что ты не робот

Как вычесть месяцы из даты в R?

Я пытаюсь вычесть n месяцев с даты следующим образом:

maturity <- as.Date("2012/12/31")

m <- as.POSIXlt(maturity)

m$mon <- m$mon - 6

но итоговая дата 01-Jul-2012, а не 30-Jun-2012, как и следовало ожидать. Есть ли короткий способ получить такой результат?

Заранее спасибо

4b9b3361

Ответ 1

1) seq.Date. Обратите внимание, что июнь имеет только 30 дней, поэтому он не может дать 31 июня, а вместо этого дает 1 июля.

seq(as.Date("2012/12/31"), length = 2, by = "-6 months")[2]
## [1] "2012-07-01"

Если бы мы знали, что это было в конце месяца, мы могли бы сделать это:

seq(as.Date(cut(as.Date("2012/12/31"), "month")), length=2, by="-5 month")[2]-1
## "2012-06-30"

2) yearmon. Кроме того, если бы мы знали, что это конец месяца, мы могли бы использовать класс "yearmon" пакета zoo, как это:

ibrary(zoo)
as.Date(as.yearmon(as.Date("2012/12/31")) -.5, frac = 1)
## [1] "2012-06-30"

Это преобразует дату в "yearmon", вычитает 6 месяцев (.5 года), а затем преобразует ее обратно в "Date" с помощью frac=1, что означает конец месяца (frac=0 будет означать начало месяц). Это также имеет преимущество перед предыдущим решением, что оно векторизовано автоматически, т.е. as.Date(...) могло быть вектором дат.

Обратите внимание, что если класс "Date" используется только как способ представления месяцев, мы можем полностью избавиться от него и напрямую использовать "yearmon", поскольку он моделирует то, что мы хотим в первую очередь:

as.yearmon("2012-12") - .5
## [1] "Jun 2012"

3) mondate. Третьим решением является пакет mondate, который имеет то преимущество, что он возвращает конец месяца 6 месяцев назад, не зная, что мы закончили месяц:

library(mondate)
mondate("2011/12/31") - 6
## mondate: timeunits="months"
## [1] 2011/06/30

Это также векторизовано.

4) lubridate. Этот ответ lubridate был изменен в соответствии с изменениями в пакете:

library(lubridate)
as.Date("2012/12/31") %m-% months(6)
## [1] "2012-06-30"

lubridate также векторизован.