Déterminer la date de la dernière occurrence d’un jour en Python

Vous voulez une solution générale pour trouver la date de la dernière occurrence d’un jour de la semaine. Lundi dernier, par exemple. Le module datetime de Python possède des fonctions utilitaires et des classes pour vous aider à effectuer des calculs comme celui-ci.

Une solution correcte et générique à ce problème ressemble à ceci:

from datetime import datetime, timedelta

joursSem = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi',
            'Vendredi', 'Samedi', 'Dimanche']

def getDateDernier(nomjour, date_debut=None):
    if date_debut is None:
        date_debut = datetime.today()
    num_jour = date_debut.weekday()
    num_jour_cible = joursSem.index(nomjour)
    diff_jour = (7 + num_jour - num_jour_cible) % 7
    if diff_jour == 0:
        diff_jour = 7
    date_cible = date_debut - timedelta(days=diff_jour)
    return date_cible

L’utiliser dans une session shell ressemblerait à ceci:

>>> datetime.today()  # un exemple
datetime.datetime(2018, 8, 28, 22, 4, 30, 263076)
>>> getDateDernier('Lundi')
datetime.datetime(2018, 8, 27, 22, 3, 57, 29045)
>>> getDateDernier('Mardi') # de la semaine précédente
datetime.datetime(2018, 8, 21, 22, 4, 12, 629771)
>>> getDateDernier('Vendredi')
datetime.datetime(2018, 8, 24, 22, 5, 9, 911393)
>>>

L’option start_date peut être fournie en utilisant une autre instance datetime. Par exemple:

>>> getDateDernier('Dimanche', datetime(2018, 12, 21))
datetime.datetime(2018, 12, 16, 0, 0)
>>>

Ce code fonctionne en mappant la date de début et la date cible à leur position numérique dans la semaine (avec le lundi comme jour 0).

L’arithmétique modulaire est ensuite utilisée pour déterminer combien de jours il y a eu la dernière date cible. De là, la date souhaitée est calculée à partir de la date de début en soustrayant une instance timedelta appropriée.

Si vous effectuez beaucoup de calculs de date comme celui-ci, vous feriez peut-être mieux d’installer le module python-dateutil à la place.

Par exemple, voici un exemple d’exécution du même calcul en utilisant la fonction relativedelta() de dateutil:

>>> from datetime import datetime
>>> from dateutil.relativedelta import relativedelta
>>> from dateutil.rrule import *
>>> d = datetime.now()
>>> print(d)
2018-12-23 16:31:52.718111

>>> # Vendredi prochain
>>> print(d + relativedelta(weekday=FR))
2018-12-28 16:31:52.718111
>>>

>>> # Vendredi précédent
>>> print(d + relativedelta(weekday=FR(-1)))
2018-12-21 16:31:52.718111
>>>

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here