Как определить, является ли дата выходным или нет (не используя lubridate)

У меня есть вектор объектов даты (yyyy-mm-dd), и я хочу определить, есть ли кто-нибудь из них в выходные или нет. Есть ли функция, которая может определить это сразу?

Я могу использовать wday() в пакете lubridate, а затем определить, будет ли возвращаемое значение 01 или 07, но что-нибудь еще более прямолинейное?

x <- seq(Sys.Date()-10, Sys.Date(), by = 1)
x[lubridate::wday(x) %in% c(1, 7)]

Ответы

Ответ 1

Я помещаю здесь предложение @AnandaMahto, а не комментарий:

library(chron)
x <- seq(Sys.Date()-10, Sys.Date(), by = 1)
x[is.weekend(x)]

## [1] "2014-10-11" "2014-10-12" "2014-10-18"

Ответ 2

Вы можете использовать базовую функцию R weekdays().

x <- seq(Sys.Date() - 10, Sys.Date(), by = 1)
weekdays(x, abbr = TRUE)
# [1] "Wed" "Thu" "Fri" "Sat" "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat"
x[grepl("S(at|un)", weekdays(x))]
# [1] "2014-10-11" "2014-10-12" "2014-10-18"

Что касается lubridate, то wday() имеет аргумент label. Когда установлено значение TRUE, вместо чисел возвращаются имена (сокращенные) дни. Используйте аргумент abbr для изменения полных имен.

library(lubridate)
wday(x, label = TRUE)
# [1] Wed   Thurs Fri   Sat   Sun   Mon   Tues  Wed   Thurs Fri   Sat  
# Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat

Ответ 3

Другим подходом может быть использование format и %u, который дает число для дня недели, начиная с "1", представляющего "понедельник".

С этим вы можете сделать:

x <- seq(as.Date("2014-10-18")-10, Sys.Date(), by = 1)
format(x, "%u") %in% c(6, 7)
#  [1] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
x[format(x, "%u") %in% c(6, 7)]
# [1] "2014-10-11" "2014-10-12" "2014-10-18"

Ответ 4

wday в lubridate и data.table (да, data.table имеет почти все, кроме кухонной раковины:-) оба варианта:

as.POSIXlt(x, tz = tz(x))$wday + 1 # lubridate
as.POSIXlt(x)$wday + 1L            # data.table

Итак, вы могли бы теоретически просто:

as.POSIXlt("2014-10-18")$wday + 1
## [1] 7

а затем проверьте выходные дни, как и другие ответы.

Ответ 5

Вы можете использовать isWeekend из package timeDate. Трудно сделать более простой:). wday укажите, какие дни следует рассматривать как рабочие дни. По умолчанию с понедельника по пятницу.

> today <- isWeekend(Sys.Date(), wday = 1:5)
if (as.logical(today)){
  print("YES")
} else print("NO")

Из документации:

## Dates in April, currentYear:
   currentYear = getRmetricsOptions("currentYear")
   tS = timeSequence(
      from = paste(currentYear, "-03-01", sep = ""),
      to = paste(currentYear, "-04-30", sep = ""))
   tS

## Subset of Weekends:
   isWeekend(tS)
   tS[isWeekend(tS)]

Он также работает с isWeekday.

Ответ 6

Посмотрев много на эту тему, я нашел это решение особенно простым с помощью пакета RQuantLib

install.packages("RQuantLib")
library(RQuantLib)
isBusinessDay(calendar="WeekendsOnly", dates=yourdatesofinterest)

Вы можете изменить этот код с помощью разных календарей, чтобы добавить на выходные разные наборы праздничных дней в разных странах (ниже приведен только пример, но их гораздо больше).

isBusinessDay(calendar="UnitedStates", dates=yourdatesofinterest)
isBusinessDay(calendar="UnitedStates/Settlement", dates=yourdatesofinterest)
isBusinessDay(calendar="UnitedStates/NYSE", dates=yourdatesofinterest)
isBusinessDay(calendar="Sweden", dates=yourdatesofinterest)
isBusinessDay(calendar="Mexico", dates=yourdatesofinterest)

Надеюсь, это кому-нибудь поможет