Ответ 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"
У меня есть вектор объектов даты (yyyy-mm-dd
), и я хочу определить, есть ли кто-нибудь из них в выходные или нет. Есть ли функция, которая может определить это сразу?
Я могу использовать wday()
в пакете lubridate, а затем определить, будет ли возвращаемое значение 01
или 07
, но что-нибудь еще более прямолинейное?
x <- seq(Sys.Date()-10, Sys.Date(), by = 1)
x[lubridate::wday(x) %in% c(1, 7)]
Я помещаю здесь предложение @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"
Вы можете использовать базовую функцию 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
Другим подходом может быть использование 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"
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
а затем проверьте выходные дни, как и другие ответы.
Вы можете использовать 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
.
Посмотрев много на эту тему, я нашел это решение особенно простым с помощью пакета 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)
Надеюсь, это кому-нибудь поможет