561 votes

La création d'un éventail de dates en Python

Je veux créer une liste de dates, à partir d'aujourd'hui, et de revenir à un nombre arbitraire de jours, par exemple, dans mon exemple 100 jours. Est-il une meilleure façon de le faire que cela?

import datetime

a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
    dateList.append(a - datetime.timedelta(days = x))
print dateList

681voto

S.Lott Points 207588

Un peu mieux...

base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(0, numdays)]

421voto

fantabolous Points 431

Les Pandas est grand pour le temps de la série en général, et a le soutien direct des plages de dates.

import pandas as pd
datelist = pd.date_range(pd.datetime.today(), periods=100).tolist()

Il a aussi beaucoup d'options pour rendre la vie plus facile. Par exemple, si vous souhaitez uniquement les jours de la semaine, vous serait-il suffit de l'échanger en bdate_range.

Voir http://pandas.pydata.org/pandas-docs/stable/timeseries.html#generating-ranges-of-timestamps

134voto

Sandeep Points 5289

Obtenir la gamme de dates entre le début et date de fin (Optimisé pour le temps et l'espace de la complexité):

import datetime

start = datetime.datetime.strptime("21-06-2014", "%d-%m-%Y")
end = datetime.datetime.strptime("07-07-2014", "%d-%m-%Y")
date_generated = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)]

for date in date_generated:
    print date.strftime("%d-%m-%Y")

50voto

Ayman Hourieh Points 39435

Vous pouvez écrire un générateur de fonction qui renvoie la date d'objets à partir d'aujourd'hui:

import datetime

def date_generator():
  from_date = datetime.datetime.today()
  while True:
    yield from_date
    from_date = from_date - datetime.timedelta(days=1)

Ce générateur renvoie la date à compter d'aujourd'hui et de revenir un jour à la fois. Voici comment faire pour prendre les 3 premières dates:

>>> import itertools
>>> dates = itertools.islice(date_generator(), 3)
>>> list(dates)
[datetime.datetime(2009, 6, 14, 19, 12, 21, 703890), datetime.datetime(2009, 6, 13, 19, 12, 21, 703890), datetime.datetime(2009, 6, 12, 19, 12, 21, 703890)]

L'avantage de cette approche sur une boucle ou d'une compréhension de liste, c'est que vous pouvez revenir autant de fois que vous le souhaitez.

Modifier

Une version plus compacte à l'aide d'un générateur d'expression au lieu d'une fonction:

date_generator = (datetime.datetime.today() - datetime.timedelta(days=i) for i in itertools.count())

Utilisation:

>>> dates = itertools.islice(date_generator, 3)
>>> list(dates)
[datetime.datetime(2009, 6, 15, 1, 32, 37, 286765), datetime.datetime(2009, 6, 14, 1, 32, 37, 286836), datetime.datetime(2009, 6, 13, 1, 32, 37, 286859)]

41voto

BOFH Points 107

ouais, réinventer la roue.... juste une recherche sur le forum, et vous obtiendrez quelque chose comme ceci:

from dateutil import rrule
from datetime import datetime

list(rrule.rrule(rrule.DAILY,count=100,dtstart=datetime.now()))

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