452 votes

Itération dans une plage de dates en Python

J'ai le code suivant pour le faire, mais comment puis-je l'améliorer ? Pour l'instant, je pense que c'est mieux que des boucles imbriquées, mais ça commence à devenir Perl-one-linerish quand on a un générateur dans une compréhension de liste.

day_count = (end_date - start_date).days + 1
for single_date in [d for d in (start_date + timedelta(n) for n in range(day_count)) if d <= end_date]:
    print strftime("%Y-%m-%d", single_date.timetuple())

Notes

  • Je ne l'utilise pas vraiment pour imprimer. C'est juste pour la démonstration.
  • El start_date y end_date Les variables sont datetime.date car je n'ai pas besoin de l'horodatage. (Ils vont être utilisés pour générer un rapport).

Exemple de sortie

Pour une date de début de 2009-05-30 et une date de fin de validité de 2009-06-09 :

2009-05-30
2009-05-31
2009-06-01
2009-06-02
2009-06-03
2009-06-04
2009-06-05
2009-06-06
2009-06-07
2009-06-08
2009-06-09

3 votes

Juste pour préciser : Je ne pense pas qu'il y ait de différence entre 'time.strftime("%Y-%m-%d", single_date.timetuple())' et le plus court 'single_date.strftime("%Y-%m-%d")'. La plupart des réponses semblent copier le style le plus long.

11 votes

Wow, ces réponses sont beaucoup trop compliquées. Essaie ça : stackoverflow.com/questions/7274267/

0 votes

@GringoSuave : qu'est-ce qui est compliqué dans La réponse de Sean Cavanagh ?

14voto

Patrick Points 405

C'est la solution la plus lisible pour l'homme à laquelle je pense.

import datetime

def daterange(start, end, step=datetime.timedelta(1)):
    curr = start
    while curr < end:
        yield curr
        curr += step

13voto

Tor Points 117

Numpy arange peut être appliquée aux dates :

import numpy as np
from datetime import datetime, timedelta
d0 = datetime(2009, 1,1)
d1 = datetime(2010, 1,1)
dt = timedelta(days = 1)
dates = np.arange(d0, d1, dt).astype(datetime)

L'utilisation de astype est de passer de numpy.datetime64 à un tableau de datetime.datetime objets.

0 votes

Une construction ultra-mince ! La dernière ligne fonctionne pour moi avec dates = np.arange(d0, d1, dt).astype(datetime.datetime)

0 votes

+1 pour avoir posté une solution générique en une seule ligne qui autorise n'importe quel intervalle de temps, au lieu d'un pas arrondi fixe tel que l'heure/minute/ .

12voto

john Points 51

Pourquoi ne pas essayer :

import datetime as dt

start_date = dt.datetime(2012, 12,1)
end_date = dt.datetime(2012, 12,5)

total_days = (end_date - start_date).days + 1 #inclusive 5 days

for day_number in range(total_days):
    current_date = (start_date + dt.timedelta(days = day_number)).date()
    print current_date

8voto

user1767754 Points 460

Afficher les n derniers jours à partir d'aujourd'hui :

import datetime
for i in range(0, 100):
    print((datetime.date.today() + datetime.timedelta(i)).isoformat())

Sortie :

2016-06-29
2016-06-30
2016-07-01
2016-07-02
2016-07-03
2016-07-04

0 votes

Veuillez ajouter des parenthèses rondes, comme print((datetime.date.today() + datetime.timedelta(i)).isoformat())

0 votes

@TitanFighter s'il vous plaît n'hésitez pas à faire des modifications, je les accepterai.

2 votes

J'ai essayé. L'édition requiert un minimum de 6 caractères, mais dans ce cas, il est nécessaire d'ajouter seulement 2 caractères, "(" et ")".

8voto

Rik Hoekstra Points 81

Pour être complet, Pandas dispose également d'une fonction period_range pour les timestamps qui sont hors limites :

import pandas as pd

pd.period_range(start='1/1/1626', end='1/08/1627', freq='D')

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