74 votes

Comment itérer-il plusieurs jours, heures, semaines et mois en Python?

Comment puis-je itérer sur une période après des jours, des heures, des semaines ou des mois?

Quelque chose comme:

 for date in foo(from_date, to_date, delta=HOURS):
    print date
 

Où foo est une fonction, retournant un itérateur. J'ai consulté le module d'agenda, mais cela ne fonctionne que pour une année ou un mois spécifique, pas entre les dates.

117voto

Thomas Vander Stichele Points 16872

Utilisation dateutil et ses rrule mise en œuvre, comme suit:

from dateutil import rrule
from datetime import datetime, timedelta

now = datetime.now()
hundredDaysLater = now + timedelta(days=100)

for dt in rrule.rrule(rrule.MONTHLY, dtstart=now, until=hundredDaysLater):
    print dt

La sortie est

2008-09-30 23:29:54
2008-10-30 23:29:54
2008-11-30 23:29:54
2008-12-30 23:29:54

Remplacer MENSUELLES avec toute ANNUELLE, MENSUELLE, HEBDOMADAIRE, QUOTIDIENNE, HORAIRES, FINEMENT, ou d'un autre. Remplacer dtstart et jusqu'à ce que l'objet datetime vous le souhaitez.

Cette recette a l'avantage de travailler dans tous les cas, y compris tous les mois. Seul inconvénient que j'ai pu trouver est que si vous passez un numéro de jour qui n'existe pas pour tous les mois, il saute de ces mois.

50voto

DzinX Points 13452

Je ne pense pas qu'il y ait une méthode dans la bibliothèque Python, mais vous pouvez facilement en créer une vous-même en utilisant le module datetime :

 from datetime import date, datetime, timedelta

def datespan(startDate, endDate, delta=timedelta(days=1)):
    currentDate = startDate
    while currentDate < endDate:
        yield currentDate
        currentDate += delta
 

Ensuite, vous pourriez l'utiliser comme ceci:

 >>> for day in datespan(date(2007, 3, 30), date(2007, 4, 3), 
>>>                     delta=timedelta(days=1)):
>>>     print day
2007-03-30
2007-03-31
2007-04-01
2007-04-02
 

Ou, si vous souhaitez rendre votre delta plus petit:

 >>> for timestamp in datespan(datetime(2007, 3, 30, 15, 30), 
>>>                           datetime(2007, 3, 30, 18, 35), 
>>>                           delta=timedelta(hours=1)):
>>>     print timestamp
2007-03-30 15:30:00
2007-03-30 16:30:00
2007-03-30 17:30:00
2007-03-30 18:30:00
 

8voto

giltay Points 681

Pour parcourir plusieurs mois, vous avez besoin d'une recette différente, car timedeltas ne peut pas exprimer "un mois".

 from datetime import date

def jump_by_month(start_date, end_date, month_step=1):
    current_date = start_date
    while current_date < end_date:
        yield current_date
        carry, new_month = divmod(current_date.month - 1 + month_step, 12)
        new_month += 1
        current_date = current_date.replace(year=current_date.year + carry,
                                            month=new_month)
 

(NB: vous devez soustraire 1 au mois pour l'opération de module puis le rajouter à new_month , puisque les mois en datetime.date s commencent à 1.)

-1voto

dguaraglia Points 3113

Cette bibliothèque fournit un outil de calendrier pratique: mxDateTime , cela devrait suffire :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X