Lista de días según DNI par/impar para salidas en CABA
Ante la duda si a alguien le corresponden más días sobre si el DNI es par o impar vamos a sacarnos la duda.
Usamos lubridate para las cuestiones de tiempo.
library(tidyverse)
library(lubridate)
library(knitr)
No sé si hay una librería de feriados en Argentina. Por ahora los cargo a mano en una lista, consideramos que esto va a durar tres meses pero se puede variar así que cargo algunos más. También asumimos como fecha de inicio el lunes 11 de Mayo. Veamos el lado bueno, si llegamos este año navidad y año nuevo caen viernes.
feriados <- ymd(20200525, 20200615, 20200620, 20200709, 20200710, 20200817, 20201012, 20201123, 20201207, 20201208, 20201225)
iniciosalidas <- ymd(20200511)
finsalidas <- iniciosalidas + months(3)
Vemos como quedó
iniciosalidas
## [1] "2020-05-11"
finsalidas
## [1] "2020-08-11"
Armamos un intervalo de días entre el inicio y el fin. De ahí tomamos la duración (en días) que esperamos tenga el período.
diassalidas <- interval(iniciosalidas, finsalidas)/days(1)
diassalidas
## [1] 92
Con este dato elaboramos dos listas: una que contenga los números de día (1-28, 29, 30 o 31) y otro el día de la semana (de 0 a 6, 0 = domingo, 1 = lunes y así).
listadias <- format(iniciosalidas + days(0:diassalidas), format="%Y-%m-%d")
numerodia <- format(iniciosalidas + days(0:diassalidas), format="%d")
diasemana <- format(iniciosalidas + days(0:diassalidas), format="%w")
Vemos que tienen estas listas.
listadias
## [1] "2020-05-11" "2020-05-12" "2020-05-13" "2020-05-14" "2020-05-15"
## [6] "2020-05-16" "2020-05-17" "2020-05-18" "2020-05-19" "2020-05-20"
## [11] "2020-05-21" "2020-05-22" "2020-05-23" "2020-05-24" "2020-05-25"
## [16] "2020-05-26" "2020-05-27" "2020-05-28" "2020-05-29" "2020-05-30"
## [21] "2020-05-31" "2020-06-01" "2020-06-02" "2020-06-03" "2020-06-04"
## [26] "2020-06-05" "2020-06-06" "2020-06-07" "2020-06-08" "2020-06-09"
## [31] "2020-06-10" "2020-06-11" "2020-06-12" "2020-06-13" "2020-06-14"
## [36] "2020-06-15" "2020-06-16" "2020-06-17" "2020-06-18" "2020-06-19"
## [41] "2020-06-20" "2020-06-21" "2020-06-22" "2020-06-23" "2020-06-24"
## [46] "2020-06-25" "2020-06-26" "2020-06-27" "2020-06-28" "2020-06-29"
## [51] "2020-06-30" "2020-07-01" "2020-07-02" "2020-07-03" "2020-07-04"
## [56] "2020-07-05" "2020-07-06" "2020-07-07" "2020-07-08" "2020-07-09"
## [61] "2020-07-10" "2020-07-11" "2020-07-12" "2020-07-13" "2020-07-14"
## [66] "2020-07-15" "2020-07-16" "2020-07-17" "2020-07-18" "2020-07-19"
## [71] "2020-07-20" "2020-07-21" "2020-07-22" "2020-07-23" "2020-07-24"
## [76] "2020-07-25" "2020-07-26" "2020-07-27" "2020-07-28" "2020-07-29"
## [81] "2020-07-30" "2020-07-31" "2020-08-01" "2020-08-02" "2020-08-03"
## [86] "2020-08-04" "2020-08-05" "2020-08-06" "2020-08-07" "2020-08-08"
## [91] "2020-08-09" "2020-08-10" "2020-08-11"
numerodia
## [1] "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24"
## [15] "25" "26" "27" "28" "29" "30" "31" "01" "02" "03" "04" "05" "06" "07"
## [29] "08" "09" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21"
## [43] "22" "23" "24" "25" "26" "27" "28" "29" "30" "01" "02" "03" "04" "05"
## [57] "06" "07" "08" "09" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19"
## [71] "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" "01" "02"
## [85] "03" "04" "05" "06" "07" "08" "09" "10" "11"
diasemana
## [1] "1" "2" "3" "4" "5" "6" "0" "1" "2" "3" "4" "5" "6" "0" "1" "2" "3"
## [18] "4" "5" "6" "0" "1" "2" "3" "4" "5" "6" "0" "1" "2" "3" "4" "5" "6"
## [35] "0" "1" "2" "3" "4" "5" "6" "0" "1" "2" "3" "4" "5" "6" "0" "1" "2"
## [52] "3" "4" "5" "6" "0" "1" "2" "3" "4" "5" "6" "0" "1" "2" "3" "4" "5"
## [69] "6" "0" "1" "2" "3" "4" "5" "6" "0" "1" "2" "3" "4" "5" "6" "0" "1"
## [86] "2" "3" "4" "5" "6" "0" "1" "2"
Para lo que sigue la forma más fácil de organizar la información va a ser armar un dataframe. Cargamos estas listas como columnas en df_dias.
df_dias <- data.frame(listadias, numerodia, diasemana, stringsAsFactors = FALSE)
head(df_dias)
## listadias numerodia diasemana
## 1 2020-05-11 11 1
## 2 2020-05-12 12 2
## 3 2020-05-13 13 3
## 4 2020-05-14 14 4
## 5 2020-05-15 15 5
## 6 2020-05-16 16 6
Vamos a dividir los días entre lunes a viernes y sábados y domingos y a asignarle a cada uno su condición de par o impar.
df_dias <- df_dias %>%
mutate(diasemana = ifelse((diasemana==6|diasemana==0),"sabado-domingo", "lunes-viernes"),
par = ifelse(as.numeric(numerodia)%%2==0,"par","impar")
)
head(df_dias)
## listadias numerodia diasemana par
## 1 2020-05-11 11 lunes-viernes impar
## 2 2020-05-12 12 lunes-viernes par
## 3 2020-05-13 13 lunes-viernes impar
## 4 2020-05-14 14 lunes-viernes par
## 5 2020-05-15 15 lunes-viernes impar
## 6 2020-05-16 16 sabado-domingo par
Recuerdan la lista de feriados? Vamos a agregar esa característica también
df_dias$feriado <- ifelse((ymd(df_dias$listadias) %in% feriados)==TRUE, "feriado", "no feriado")
head(df_dias)
## listadias numerodia diasemana par feriado
## 1 2020-05-11 11 lunes-viernes impar no feriado
## 2 2020-05-12 12 lunes-viernes par no feriado
## 3 2020-05-13 13 lunes-viernes impar no feriado
## 4 2020-05-14 14 lunes-viernes par no feriado
## 5 2020-05-15 15 lunes-viernes impar no feriado
## 6 2020-05-16 16 sabado-domingo par no feriado
Sabiendo si un día de la semana cae de lunes a viernes y si es feriado o no podemos determinar si es un día hábil. Si no es sábado, domingo o feriado.
df_dias$habil <- ifelse((df_dias$diasemana=="lunes-viernes"&df_dias$feriado=="no feriado"),"hábil", "no hábil")
head(df_dias)
## listadias numerodia diasemana par feriado habil
## 1 2020-05-11 11 lunes-viernes impar no feriado hábil
## 2 2020-05-12 12 lunes-viernes par no feriado hábil
## 3 2020-05-13 13 lunes-viernes impar no feriado hábil
## 4 2020-05-14 14 lunes-viernes par no feriado hábil
## 5 2020-05-15 15 lunes-viernes impar no feriado hábil
## 6 2020-05-16 16 sabado-domingo par no feriado no hábil
Sólo queda agrupar los días según pares e impares y contar los hábiles de cada uno.
kable(df_dias %>% group_by(par, habil) %>% summarize(dias = n()))
par | habil | dias |
---|---|---|
impar | hábil | 32 |
impar | no hábil | 16 |
par | hábil | 31 |
par | no hábil | 14 |
Podríamos correr el programa varias veces para ver cuantos días corresponden por cada mes de cuarentena pero mejor lo ponemos todo en un loop y lo iteramos.
df_meses <- data.frame()
for(i in 1:6){
iniciosalidas <- ymd(20200511)
finsalidas <- iniciosalidas + months(i)
diassalidas <- interval(iniciosalidas, finsalidas)/days(1)
listadias <- format(iniciosalidas + days(0:diassalidas), format="%Y-%m-%d")
numerodia <- format(iniciosalidas + days(0:diassalidas), format="%d")
diasemana <- format(iniciosalidas + days(0:diassalidas), format="%w")
df_dias <- data.frame(listadias, numerodia, diasemana, stringsAsFactors = FALSE)
df_dias <- df_dias %>%
mutate(diasemana = ifelse((diasemana==6|diasemana==0),"sabado-domingo", "lunes-viernes"),
par = ifelse(as.numeric(numerodia)%%2==0,"par","impar")
)
df_dias$feriado <- ifelse((ymd(df_dias$listadias) %in% feriados)==TRUE, "feriado", "no feriado")
df_dias$habil <- ifelse((df_dias$diasemana=="lunes-viernes"&df_dias$feriado=="no feriado"),"hábil", "no hábil")
df_resumen <- df_dias %>% group_by(par, habil) %>% summarize(dias = n())
lista_resumen <- as.data.frame(t(c(i, df_resumen$dias)))
df_meses <- rbind(df_meses, lista_resumen)
}
colnames(df_meses) <- c("Meses", "Días hábiles impares", "Días no hábiles impares", "Días hábiles pares", "Días no hábiles pares")
kable(df_meses)
Meses | Días hábiles impares | Días no hábiles impares | Días hábiles pares | Días no hábiles pares |
---|---|---|---|---|
1 | 12 | 5 | 11 | 4 |
2 | 20 | 12 | 21 | 9 |
3 | 32 | 16 | 31 | 14 |
4 | 43 | 21 | 42 | 18 |
5 | 53 | 26 | 52 | 23 |
6 | 64 | 31 | 63 | 27 |