Pouvoir générer la liste de tous les jours ouvrés d'un mois, d'un trimestre, d'un semestre ou d'une année et en excluant les jours fériés existants.
Pour cela je vais également utiliser la classe JoursFeries créée dans un précédent article.
from dateutil.parser import parse
from dateutil.rrule import rrule, DAILY
from dateutil.relativedelta import relativedelta
from dateutil.relativedelta import MO, TU, WE, TH, FR
dtstart = parse('2022-01-01')
list_jours_ouvres = list(
map(
lambda x: x.date(),
rrule(DAILY, dtstart=dtstart, until=dtstart + relativedelta(months=4, day=1, days=-1),
byweekday=[MO, TU, WE, TH, FR])
)
)
Je vais donc générer une liste de tous les jours ouvrés, du lundi au vendredi, du 1er janvier au 30 avril (4 mois).
>>> list_jours_ouvres
[datetime.date(2022, 1, 3),
datetime.date(2022, 1, 4),
datetime.date(2022, 1, 5),
datetime.date(2022, 1, 6),
datetime.date(2022, 1, 7),
datetime.date(2022, 1, 10),
datetime.date(2022, 1, 11),
datetime.date(2022, 1, 12),
datetime.date(2022, 1, 13),
...
datetime.date(2022, 4, 18),
datetime.date(2022, 4, 19),
datetime.date(2022, 4, 20),
datetime.date(2022, 4, 21),
datetime.date(2022, 4, 22),
datetime.date(2022, 4, 25),
datetime.date(2022, 4, 26),
datetime.date(2022, 4, 27),
datetime.date(2022, 4, 28),
datetime.date(2022, 4, 29)]
>>> len(list_jours_ouvres)
85
J'ai donc une liste comprenant 85 jours ouvrés du lundi au vendredi du 3 janvier au 29 avril.
Pour supprimer les jours fériés de la liste
>>> set(list_jours_ouvres) - set(JoursFeries(dtstart.year).to_list())
{datetime.date(2022, 1, 3),
datetime.date(2022, 1, 4),
datetime.date(2022, 1, 5),
datetime.date(2022, 1, 6),
datetime.date(2022, 1, 7),
datetime.date(2022, 1, 10),
datetime.date(2022, 1, 11),
datetime.date(2022, 1, 12),
datetime.date(2022, 1, 13),
datetime.date(2022, 1, 14),
datetime.date(2022, 1, 17),
datetime.date(2022, 1, 18),
datetime.date(2022, 1, 19),
datetime.date(2022, 1, 20),
datetime.date(2022, 1, 21),
datetime.date(2022, 1, 24),
...
datetime.date(2022, 4, 13),
datetime.date(2022, 4, 14),
datetime.date(2022, 4, 15),
datetime.date(2022, 4, 19),
datetime.date(2022, 4, 20),
datetime.date(2022, 4, 21),
datetime.date(2022, 4, 22),
datetime.date(2022, 4, 25),
datetime.date(2022, 4, 26),
datetime.date(2022, 4, 27),
datetime.date(2022, 4, 28),
datetime.date(2022, 4, 29)}
>>> len(set(list_jours_ouvres) - set(JoursFeries(dtstart.year).to_list()))
84
Résultat, 1 jour a été supprimé de la liste.
Il s'agit du lundi de Pâques le 18 avril 2022.
>>> for x in JoursFeries(dtstart.year).proprietes:
print(f"{x:<20} {getattr(JoursFeries(dtstart.year), x).strftime('%a %d %b %Y')}")
JOUR_DE_L_AN Sat 01 Jan 2022
PAQUES Sun 17 Apr 2022
LUNDI_DE_PAQUES Mon 18 Apr 2022
FETE_DU_TRAVAIL Sun 01 May 2022
VICTOIRE_1945 Sun 08 May 2022
ASCENSION Thu 26 May 2022
PENTECOTE Sun 05 Jun 2022
LUNDI_DE_PENTECOTE Mon 06 Jun 2022
FETE_NATIONALE Thu 14 Jul 2022
ASSOMPTION Mon 15 Aug 2022
TOUSSAINT Tue 01 Nov 2022
ARMISTICE_1918 Fri 11 Nov 2022
NOEL Sun 25 Dec 2022