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