4 votes

Existe-t-il un moyen cohérent d'énumérer les jours/semaines/mois entre deux dates ?

J'ai deux datetime une date de début et une date de fin. J'ai besoin d'énumérer les jours, les semaines et les mois compris entre ces deux dates.

Idéalement, les résultats devraient être en datetime mais toute forme compatible convient. Les semaines et les mois sont représentés par une date correspondant au premier jour de la semaine/du mois, où le lundi est le premier jour de la semaine, comme dans la norme ISO-8601. Cela signifie que le résultat peut contenir une date antérieure à la date de début.

Par exemple, pour la période du 2010-11-28 au 2010-12-01, les résultats seraient les suivants :

days: 2010-11-28, 2010-11-29, 2010-11-30, 2010-12-01

weeks: 2010-11-22, 2010-11-29

months: 2010-11-01, 2010-12-01

Je réalise que la liste des jours est en soi simple, mais j'aimerais une solution propre et cohérente qui utilise une approche similaire pour les trois. Il semble que le calendar devrait être utile, mais je ne vois pas de bonne façon de l'utiliser dans ce but.

4voto

unutbu Points 222216

Utilisation de dateutil :

import datetime
import dateutil.rrule as drrule
import dateutil.relativedelta as drel
import pprint

def dt2d(date):
    '''
    Convert a datetime.datetime to datetime.date object
    '''
    return datetime.date(date.year,date.month,date.day)

def enumerate_dates(start,end):
    days=map(dt2d,drrule.rrule(drrule.DAILY, dtstart=start, until=end))

    # Find the Monday on or before start
    start_week=start+drel.relativedelta(weekday=drel.MO(-1))
    end_week=end+drel.relativedelta(weekday=drel.MO(-1))
    weeks=map(dt2d,drrule.rrule(drrule.WEEKLY, dtstart=start_week, until=end_week))

    # Find the first day of the month
    start_month=start.replace(day=1)
    end_month=end.replace(day=1)
    months=map(dt2d,drrule.rrule(drrule.MONTHLY, dtstart=start_month, until=end_month))
    return days,weeks,months

if __name__=='__main__':
    days,weeks,months=enumerate_dates(datetime.date(2010,11,28),
                                      datetime.date(2010,12,01))
    print('''\
days: {d}
weeks: {w}
months: {m}'''.format(d=map(str,days),w=map(str,weeks),m=map(str,months)))

donne

days: ['2010-11-28', '2010-11-29', '2010-11-30', '2010-12-01']
weeks: ['2010-11-22', '2010-11-29']
months: ['2010-11-01', '2010-12-01']

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