J'ai un vecteur d'objets de date (yyyy-mm-dd
) Et je veux déterminer si l'un d'eux est le week-end ou non. Y a-t-il une fonction qui peut déterminer cela immédiatement?
Je peux utiliser wday()
dans le package lubridate et puis déterminer si la valeur retournée est 01
Ou 07
, Mais quoi de plus simple?
x <- seq(Sys.Date()-10, Sys.Date(), by = 1)
x[lubridate::wday(x) %in% c(1, 7)]
Je mets ici la suggestion de @ AnandaMahto plutôt qu'un commentaire:
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"
Vous pouvez utiliser la fonction de base 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"
En ce qui concerne lubridate, wday()
a un argument label
. Lorsqu'il est défini sur TRUE
, les noms de jours (abrégés) sont renvoyés au lieu de nombres. Utilisez l'argument abbr
pour passer aux noms complets.
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
Une autre approche pourrait consister à utiliser format
et %u
, qui donne un nombre pour le jour de la semaine, commençant par "1" représentant "lundi".
Avec cela, vous pouvez faire:
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
dans les deux lubridate
et data.table
(Oui, data.table
a à peu près tout, mais l'évier de cuisine :-) les deux font une variation sur:
as.POSIXlt(x, tz = tz(x))$wday + 1 # lubridate
as.POSIXlt(x)$wday + 1L # data.table
Vous pourriez donc, en théorie, simplement faire:
as.POSIXlt("2014-10-18")$wday + 1
## [1] 7
puis testez les jours de week-end comme le font les autres réponses.
Vous pouvez utiliser isWeekend
from package timeDate . Difficile de faire plus simple :). wday
spécifiez quels jours doivent être considérés comme des jours de la semaine. Par défaut du lundi au vendredi.
> today <- isWeekend(Sys.Date(), wday = 1:5)
if (as.logical(today)){
print("YES")
} else print("NO")
De la documentation:
## 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)]
Il fonctionne également avec isWeekday
.
Après avoir beaucoup cherché sur ce sujet, j'ai trouvé cette solution particulièrement simple en utilisant le package RQuantLib
install.packages("RQuantLib")
library(RQuantLib)
isBusinessDay(calendar="WeekendsOnly", dates=yourdatesofinterest)
Vous pouvez modifier ce code avec différents calendriers pour ajouter aux week-ends différents ensembles de vacances dans différents pays (ci-dessous juste un exemple, mais ils en ont beaucoup plus).
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)
J'espère que ça aide quelqu'un
En utilisant lubridate pour éviter d'autres packages, vous pouvez utiliser:
is_weekday = function(timestamp){
lubridate::wday(timestamp, week_start = 1) < 6
}