Pour calculer le nombre de jours ouvrés dans un mois, je vais utiliser les modules calendar et numpy
>>> import numpy as np
>>> import calendar
La méthode monthcalendar de la classe calendar permet d'obtenir un array avec tous les jours du mois classés par semaine (du lundi au dimanche)
>>> calendar.monthcalendar(2019,10)
[[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27], [28, 29, 30, 31, 0, 0, 0]]
Je le convertis en array numpy
>>> a = np.array(calendar.monthcalendar(2019,10))
>>> a
array([[ 0, 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12, 13],
[14, 15, 16, 17, 18, 19, 20],
[21, 22, 23, 24, 25, 26, 27],
[28, 29, 30, 31, 0, 0, 0]])
J'affiche uniquement les 5 premiers jours de chaque semaine
>>> a[:,:-2]
array([[ 0, 1, 2, 3, 4],
[ 7, 8, 9, 10, 11],
[14, 15, 16, 17, 18],
[21, 22, 23, 24, 25],
[28, 29, 30, 31, 0]])
Enfin, je compte le nombre d'éléments supérieurs à 0
>>> len(a[np.where(a[:,:-2] > 0)])
23
Le mois d'octobre de l'année 2019 compte 23 jours ouvrés.
Il est également possible d'utiliser la méthode nonzero de la classe numpy
>>> len(a[np.nonzero(a[:,:5])])
23
Une autre méthode consiste à utiliser le puissant module dateutil
>>> from dateutil.parser import *
>>> from dateutil.rrule import *
>>> from dateutil.relativedelta import *
>>> dtstart = parse('20200601')
>>> len(list(rrule(DAILY, dtstart=dtstart, until=dtstart+relativedelta(months=+1, days=-1), byweekday=[MO, TU, WE, TH, FR])))
22
La classe parser permet de convertir une date d'un format texte à un format datetime.datetime
La classe relativedelta permet d'incrémenter une date ou de calculer l'écart entre deux dates
La classe rrule permet de générer toute une liste de dates suivant différents critères