Pourquoi ça commence en décembre? Et 1 1 se répète à la fin. Quelle est la manière la plus pythonique d'itérer sur tous les jours d'une année donnée (avec la gestion de l'année bissextile)?

import calendar

a = calendar.Calendar(0)
for b in range(1,13):
    for x in a.itermonthdates(2016,b):
        print x.month, x.day

Production:

12 28
12 29
12 30
12 31
1 1
1 2
1 3
..
..
..

Sortie complète:

http://pastebin.com/nnP4ADQK

1
MYGz 15 janv. 2017 à 05:24

2 réponses

Meilleure réponse

itermonthdates renvoie des semaines complètes:

itermonthdates (année, mois) Renvoie un itérateur pour le mois mois (1–12) de l'année année. Cet itérateur renverra tous les jours (en tant qu'objets datetime.date) du mois et tous les jours avant le début du mois ou après la fin du mois nécessaires pour obtenir une semaine complète.

Vous pouvez simplement rejeter les dates où l'année n'est pas 2016:

import calendar

a = calendar.Calendar(0)
g = (x for b in xrange(1, 13) for x in a.itermonthdates(2016, b) if x.year == 2016)
print next(g)

Production:

2016-01-01
3
niemmi 15 janv. 2017 à 02:34

itermonthdates renvoie toutes les semaines, y compris les jours du mois. La vérification devrait donc être effectuée tous les mois.

import calendar 
a = calendar.Calendar(0)
for b in range(1,13):
    for x in a.itermonthdates(2017,b):
        if x.month==b:
            print x #x.month, x.day
0
volvox 15 janv. 2017 à 02:49