Pull to refresh

Comments 2

find.last.mondays.of.months <- function (dates) {
  stopifnot(is(dates, 'POSIXlt'))
  all.mondays <- which(dates$wday == 1)
  first.mondays.among.all <- which(dates[all.mondays]$mday <= 7)
  all.mondays[setdiff(first.mondays.among.all - 1, 0)]
}

require(timeDate)
test.dates <- as.POSIXlt(timeDate::timeSequence(from = '2023-01-01', to = '2024-12-31', by = 'day'))

test.dates[find.last.mondays.of.months(test.dates)]

Алгоритм: находим все понедельники (wday == 1); среди них находим первые понедельники месяца (mday <= 7); среди всех понедельников выбираем те, что предшествуют первым понедельникам.

Для большего быстродействия нужно однократно сосчитать последние понедельники месяца за нужные годы (600 значений за 50 лет), после чего в любом наборе дат можно будет найти последние понедельники месяца оператором %in%.

Спасибо за статью.
Часто сталкиваюсь с подобными задачами, но вместо написаний собственных функций прибегаю к пакету Алексея Селезнева ( https://habr.com/ru/post/469215/ )

Sign up to leave a comment.

Articles