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.
Заметки по R: находим каждый последний понедельник месяца в наборе данных