web-dev-qa-db-fra.com

Comment déterminer si la date est un week-end ou non (ne pas utiliser de lubrifiant)

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)]
20
DonDyck

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"
12
Tyler Rinker

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
20
Rich Scriven

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"
10

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.

5
hrbrmstr

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.

0
Florent

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

0
Ivan

En utilisant lubridate pour éviter d'autres packages, vous pouvez utiliser:

is_weekday = function(timestamp){
  lubridate::wday(timestamp, week_start = 1) < 6
}
0
rsmith54