Получите вектор вторников, но если вторник выпадает на выходной, то замените его на среду в R - PullRequest
2 голосов
/ 23 января 2011

Я бы хотел найти все вторники между двумя датами. Но если вторник попадает в пользовательский список праздников, я бы предпочел среду.

Этот код работает в моих тестах, но он довольно дрянной, и я боюсь, что он потерпит неудачу.

low.date <- "1996-01-01"
high.date <- "1997-01-01"
holidays = c("01-01", "07-04", "12-25")
tues <- seq(as.Date(low.date), as.Date(high.date), by = 1) 
tues <- subset(tues, format(tues, "%a") == "Tue")
tues <- ifelse(format(tues, "%m-%d") %in% holidays, tues + 1, tues)
tues <- as.Date(tues, origin = "1970-01-01")

Спасибо! Я вижу ответы, указывающие на пакет timeDate, но я вижу только методы поиска рабочих дней или выходных. Есть ли логика чище / безопаснее, чем то, что я использую?

Ответы [ 2 ]

4 голосов
/ 23 января 2011

Трудно изменить логику вашего решения. Но здесь другая форма с использованием функции wday из пакета lubridate.

hol_tue <-  wday(tues) == 3L & format(tues, "%m-%d") %in% holidays
wday(tues)[hol_tue] <- 4

Немного неудобно в lubridate package отсчет дней начинается с воскресенья с воскресенья, являющегося днем ​​1, а не POSIXlt, где это 0.

2 голосов
/ 23 января 2011

POSIXlt в базовом пакете дает вам доступ к wday в виде числа, что немного безопаснее, поскольку названия дней меняются от системы к системе.

low.date <- "1996-01-01"
high.date <- "1997-01-01"
holidays <- c("01-01", "07-04", "12-25")

all.days <- seq(as.Date(low.date), as.Date(high.date), by = "day")

# Tuesday is Day 2 of the week
all.tues <- all.days[as.POSIXlt(all.days)$wday == 2]
tues.holidays <- format(all.tues, "%m-%d") %in% holidays
all.tues[tues.holidays] <- all.tues[tues.holidays] + 1
...