Recherche de la plage des dates du mois en cours en Python

Vous avez un code qui doit boucler sur chaque date du mois en cours, et vous voulez un moyen efficace de calculer cette plage de dates.

Il n’est pas nécessaire de créer une liste de toutes les dates à l’avance pour faire des boucles sur les dates. Vous pouvez tout simplement calculer les dates de début et de fin dans la plage, puis utiliser les objets datetime.timedelta pour incrémenter la date au fur et à mesure.

Voici une fonction qui prend n’importe quel objet datetime, et retourne un tuple contenant la première date du mois et la date de début du mois suivant:

from datetime import datetime, date, timedelta
import calendar

def PlageMois(date_debut=None):
    if date_debut is None:
        date_debut = date.today().replace(day=1), jours_du_mois = calendar.monthrange(date_debut.year, date_debut.month)
    date_fin = date_debut + timedelta(days=jours_du_mois)
    return (date_debut, date_fin)

Avec cela en place, c’est assez simple de faire des boucles sur une plage de dates:

>>> jour = timedelta(days=1)
>>> premier_jour, dernier_jour= PlageMois()
>>> while premier_jour< dernier_jour:
...     print(premier_jour)
...     premier_jour+= jour
...
2018-08-01
2018-08-02
2018-08-03
2018-08-04
2018-08-05
2018-08-06
2018-08-07
#.... et ainsi de suite.....

Cette recette fonctionne en calculant d’abord une date correspondant au premier jour du mois. Un moyen rapide de le faire est d’utiliser la méthode replace() d’un objet date ou datetime pour simplement définir l’attribut jours à 1.

Une bonne chose à propos de la méthode replace() est qu’elle crée le même type d’objet que celui avec lequel vous avez commencé.

Ainsi, si l’entrée était une instance de date, le résultat est une date. De même, si l’entrée était une instance de datetime, vous obtenez une instance de datetime.Après cela, la fonction calendar.monthrange() est utilisée pour savoir combien de jours sont dans le mois en question.

Chaque fois que vous avez besoin d’obtenir des informations de base sur les calendriers, le module calendar peut être utile. La méthode monthrange() n’est qu’une de ces fonctions qui retourne un tuple contenant le jour de la semaine ainsi que le nombre de jours dans le mois.

Une fois que le nombre de jours du mois est connu, la date de fin est calculée en ajoutant un timedelta approprié à la date de début.

C’est subtil, mais un aspect important de ce code est que la date de fin ne doit pas être incluse dans la plage (c’est en fait le premier jour du mois suivant). Cela reflète le comportement des tranches et des opérations range de Python, qui n’incluent jamais le point final.

Pour boucler sur une plage de dates, des opérateurs mathématiques et de comparaison standard sont utilisés. Par exemple, les instances timedelta peuvent être utilisées pour incrémenter la date. L’opérateur < est utilisé pour vérifier si une date est antérieure à la date de fin.

Idéalement, il serait bien de créer une fonction qui fonctionne comme la fonction intégrée range(), mais pour les dates. Heureusement, c’est extrêmement facile à mettre en œuvre à l’aide d’un générateur:

def plage_date(debut, arret, increment):
    while debut< arret:
        yield debut
        debut+= increment

En voici un exemple d’utilisation:

>>> for d in plage_date(datetime(2012, 9, 1), datetime(2018,10,1),
                        timedelta(hours=6)):
...     print(d)
...
2018-09-01 00:00:00
2018-09-01 06:00:00
2018-09-01 12:00:00
2018-09-01 18:00:00
2018-09-02 00:00:00
2018-09-02 06:00:00
...
>>>

Encore une fois, une grande partie de la facilité de mise en œuvre est que les dates et les heures peuvent être manipulées à l’aide d’opérateurs mathématiques et de comparaison standard.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here