una tipo separar mes fechas fecha extraer año agregar r datetime lubridate

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"