Zapoznałem się z dokumentacją dateutil
. Okazuje się, że to zapewnia jeszcze bardziej wygodny sposób niż za pomocą dateutil.relativedelta
: recurrence rules (examples)
dla zadania pod ręką, to jest tak proste, jak
from dateutil.rrule import *
from datetime import date
months = map(
date.isoformat,
rrule(MONTHLY, dtstart=date(2010, 8, 1), until=date.today())
)
Drobnym drukiem
Należy pamiętać, że jesteśmy oszukuje trochę, tutaj. Elementy, które produkuje dateutil.rrule.rrule
są typu datetime.datetime
, nawet jeśli przekazujemy dtstart
i until
typu datetime.date
, tak jak to robimy powyżej. Pozwoliłem map
przekazać je do funkcji date
isoformat
, która po prostu okazuje się konwertować je na ciągi, jak gdyby były to tylko daty bez informacji o czasie.
Dlatego pozornie równoważne listowego
[day.isoformat()
for day in rrule(MONTHLY, dtstart=date(2010, 8, 1), until=date.today())]
wróci listę jak
['2010-08-01T00:00:00',
'2010-09-01T00:00:00',
'2010-10-01T00:00:00',
'2010-11-01T00:00:00',
⋮
'2015-12-01T00:00:00',
'2016-01-01T00:00:00',
'2016-02-01T00:00:00']
Zatem, jeśli chcemy użyć wyrażeń listowych zamiast map
, musimy coś zrobić jak
[dt.date().isoformat()
for dt in rrule(MONTHLY, dtstart=date(2010, 8, 1), until=date.today())]
Ani, to jest prawie poprawne, ale musisz sformatować datetime w taki sposób, aby pojawił się w formacie ISO. Można to zrobić, dołączając isoformat. Powinieneś zmienić linię na 'result.append (current.isoformat())' - [EDIT: nie widzisz, że zostawiłeś formatowanie jako ćwiczenie ... ale no cóż.] –
Dzięki, faktycznie zrobiłem ' result.append (datetime.strftime (current, '% Y-% m-01')) ', aby uzyskać żądany format. – Richard