Spróbuj tego:
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
Przykład na pytanie, "co 8 godzin między teraz i jutro 19:00" będzie napisane tak:
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')
Należy zauważyć, że prawidłowe wartości dla period
są wartościami zdefiniowanymi dla względnej informacji relativedelta
, a mianowicie: 'years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds', 'microseconds'
.
Moje rozwiązanie zwraca listę, zgodnie z wymaganiami w pytaniu. Jeśli nie potrzebujesz wszystkich elementów jednocześnie, możesz użyć generatorów, tak jak w odpowiedzi @MartijnPieters.
Python powinien dopuszczać daty w "zakresie". Miałoby to sens tylko. Jest powód, dla którego jest słabo wpisany ... –
@TylerCrompton: "Jawny jest lepszy niż niejawny." Co zwiększyłoby się w zakresie: dni, sekundy, mikrosekundy, milisekundy, minuty, godziny lub tygodnie? –
@NoctisSkytower Wartość kroku byłaby obiektem 'timedelta'. –