Prueba esto:
from datetime import datetime
from dateutil.relativedelta import relativedelta
def date_range(start_date, end_date, increment, period):
result = []
nxt = start_date
delta = relativedelta(**{period:increment})
while nxt <= end_date:
result.append(nxt)
nxt += delta
return result
El ejemplo de la pregunta, "cada 8 horas entre hoy y mañana 19:00" se escribiría así:
start_date = datetime.now()
end_date = start_date + relativedelta(days=1)
end_date = end_date.replace(hour=19, minute=0, second=0, microsecond=0)
date_range(start_date, end_date, 8, 'hours')
Observe que los valores válidos para period
son los definidos para la información relativa al relativedelta
, a saber: 'years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds', 'microseconds'
.
Mi solución devuelve lista, como se requiere en la pregunta. Si no necesita todos los elementos a la vez, puede usar generadores, como en la respuesta de @MartijnPieters.
Python debería permitir las fechas en 'rango'. Solo tendría sentido. Hay una razón por la que es débil tipeado ... –
@TylerCrompton: "Explicit es mejor que implícito". ¿Qué se incrementaría en el rango: días, segundos, microsegundos, milisegundos, minutos, horas o semanas? –
@NoctisSkytower El valor del paso sería un objeto 'timedelta'. –