Creando un rango de fechas en Python

Resuelto Thomas Browne asked hace 15 años • 24 respuestas

Quiero crear una lista de fechas, comenzando hoy y retrocediendo un número arbitrario de días, digamos, en mi ejemplo, 100 días. ¿Hay una mejor manera de hacerlo que esta?

import datetime

a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
    dateList.append(a - datetime.timedelta(days = x))
print dateList
Thomas Browne avatar Jun 15 '09 01:06 Thomas Browne
Aceptado

Marginalmente mejor...

base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(numdays)]
S.Lott avatar Jun 14 '2009 18:06 S.Lott

Pandases excelente para series temporales en general y tiene soporte directo para rangos de fechas.

Por ejemplo pd.date_range():

import pandas as pd
from datetime import datetime

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

También tiene muchas opciones para hacer la vida más fácil. Por ejemplo, si solo quisiera los días laborables, simplemente cambiaría bdate_range.

Ver documentación del rango de fechas

Además, es totalmente compatible con las zonas horarias de pytz y puede abarcar sin problemas los cambios de horario de verano de primavera/otoño.

EDITAR por OP:

Si necesita fechas y horas reales de Python, a diferencia de las marcas de tiempo de Pandas:

import pandas as pd
from datetime import datetime

pd.date_range(end = datetime.today(), periods = 100).to_pydatetime().tolist()

#OR

pd.date_range(start="2018-09-09",end="2020-02-02")

Esto utiliza el parámetro "fin" para que coincida con la pregunta original, pero si desea fechas descendentes:

pd.date_range(datetime.today(), periods=100).to_pydatetime().tolist()
fantabolous avatar Apr 21 '2014 03:04 fantabolous

Obtenga un rango de fechas entre la fecha de inicio y finalización especificada (optimizado para la complejidad del tiempo y el espacio):

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")
Sandeep avatar Jul 08 '2014 16:07 Sandeep

Puedes escribir una función generadora que devuelva objetos de fecha a partir de hoy:

import datetime

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

Este generador devuelve fechas a partir de hoy y retrocediendo un día a la vez. A continuación se explica cómo tomar las primeras 3 fechas:

>>> 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)]

La ventaja de este enfoque sobre un bucle o una lista de comprensión es que puede retroceder tantas veces como desee.

Editar

Una versión más compacta que utiliza una expresión generadora en lugar de una función:

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

Uso:

>>> 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)]
Ayman Hourieh avatar Jun 14 '2009 18:06 Ayman Hourieh