Как перечислить в качестве даты 30-го числа, используя 28 или 29 февраля?

Я хочу построить список ежемесячных дат в данный день между указанными месяцами-годами. Скажем, все 15 числа месяцев с марта 2016 года по март 2018 года.

Кроме того, я хочу, чтобы переполнения, такие как 30-й день февраля, были "округлены" до последнего дня в этом месяце (а не 1 или 2 марта).

Мой код:

m <- as.POSIXlt("2018-03-30") 
m$year <- m$year -2
wDate <- as.Date(seq(from = m , to = as.POSIXlt(m), by = "month"))

wDate
 [1] "2016-03-30" "2016-04-30" "2016-05-30" "2016-06-30" "2016-07-30" "2016-08-30" "2016-09-30" "2016-10-30" "2016-11-30" "2016-12-30" "2017-01-30" "2017-03-02" "2017-03-30" "2017-04-30"
[15] "2017-05-30" "2017-06-30" "2017-07-30" "2017-08-30" "2017-09-30" "2017-10-30" "2017-11-30" "2017-12-30" "2018-01-30" "2018-03-02" "2018-03-30"

Как видно, вместо 2018-02-28, это перечисляет 2018-03-02,

Как я могу добиться желаемой настройки?

1 ответ

Для вашего первого вопроса (все 15-е числа месяца с марта 2016 года по март 2018 года) вы можете использовать seq.Date(),

m1 <- as.Date("2016-03-15")
seq.Date(from = m1, length.out = 25, by = "month")
# [1] "2016-03-15" "2016-04-15" "2016-05-15" "2016-06-15" "2016-07-15" "2016-08-15" "2016-09-15" "2016-10-15" "2016-11-15" "2016-12-15"
#[11] "2017-01-15" "2017-02-15" "2017-03-15" "2017-04-15" "2017-05-15" "2017-06-15" "2017-07-15" "2017-08-15" "2017-09-15" "2017-10-15"
#[21] "2017-11-15" "2017-12-15" "2018-01-15" "2018-02-15" "2018-03-15"

Для вашего второго запроса (я хочу, чтобы 30-й день февраля был "округлен" до последнего дня в этом месяце), вы можете использовать %m+% функция от lubridate пакет.

m2 <- as.Date("2016-03-31")

library(lubridate)
m2 %m+% months(0:24)
# [1] "2016-03-31" "2016-04-30" "2016-05-31" "2016-06-30" "2016-07-31" "2016-08-31" "2016-09-30" "2016-10-31" "2016-11-30" "2016-12-31"
#[11] "2017-01-31" "2017-02-28" "2017-03-31" "2017-04-30" "2017-05-31" "2017-06-30" "2017-07-31" "2017-08-31" "2017-09-30" "2017-10-31"
#[21] "2017-11-30" "2017-12-31" "2018-01-31" "2018-02-28" "2018-03-31"

Тип ?`%m+%` для деталей. Надеюсь это поможет.

Другие вопросы по тегам