Python: Compter le nombre de jours ouvrés dans un mois

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