Creando un rango de fechas en Python
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
Marginalmente mejor...
base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(numdays)]
Pandas
es 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()
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")
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)]