tipo - separar fecha en r
Cómo determinar si la fecha es un fin de semana o no(sin usar lubridate) (6)
Después de mirar mucho sobre este tema, encontré esta solución particularmente simple usando el paquete RQuantLib
install.packages("RQuantLib")
library(RQuantLib)
isBusinessDay(calendar="WeekendsOnly", dates=yourdatesofinterest)
Puede modificar este código con diferentes calendarios para agregar a los fines de semana diferentes conjuntos de vacaciones en diferentes países (a continuación solo un ejemplo, pero tienen muchos más).
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)
Espero que ayude a alguien
Tengo un vector de objetos de fecha (
yyyy-mm-dd
) y quiero determinar si alguno de ellos es el fin de semana o no.
¿Existe una función que pueda determinar esto inmediatamente?
Puedo usar
wday()
en el paquete
lubridate
y luego determinar si el valor devuelto es
01
o
07
, pero ¿hay algo más sencillo?
x <- seq(Sys.Date()-10, Sys.Date(), by = 1)
x[lubridate::wday(x) %in% c(1, 7)]
El
wday
en
lubridate
y
data.table
(sí,
data.table
tiene casi todo menos el fregadero de la cocina :-) ambos hacen una variación en:
as.POSIXlt(x, tz = tz(x))$wday + 1 # lubridate
as.POSIXlt(x)$wday + 1L # data.table
Entonces, en teoría, podrías hacer:
as.POSIXlt("2014-10-18")$wday + 1
## [1] 7
y luego pruebe los días de fin de semana como lo hacen otras respuestas.
Otro enfoque podría ser utilizar el
format
y
%u
, que da un número para el día de la semana, comenzando con "1" que representa "lunes".
Con eso, puedes hacer:
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"
Puede usar
isWeekend
desde el
paquete timeDate
.
Difícil de hacer más sencillo :).
wday
especifica qué días deben considerarse como días laborables.
Por defecto de lunes a viernes.
> today <- isWeekend(Sys.Date(), wday = 1:5)
if (as.logical(today)){
print("YES")
} else print("NO")
De la documentación:
## 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)]
Funciona también con
isWeekday
.
Puede usar la función base R de
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 cuanto a
lubridate
,
wday()
tiene un argumento de
label
.
Cuando se establece en
TRUE
, se devuelven los nombres de los días (abreviados) en lugar de los números.
Use el argumento
abbr
para cambiar a nombres completos.
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
Puse la sugerencia de @ AnandaMahto aquí en lugar de un comentario:
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"