Hallo,
ich habe folgendes Problem:
es sind zwei Datumsangaben gegeben z.B.
01.01.17 und 28.02.17.
Ich möchte eine Liste in der Form:
[„01.01.17“, „02.01.17“ …… „27.02.17“, „28.02.17“] am Ende kriegen.
Wie mache ich das?
Eine Liste mit Daten zwischen zwei Datumsangaben.
Code: Alles auswählen
from datetime import datetime, timedelta
DATE_FORMAT = '%d.%m.%y'
def parse_date(date, format=DATE_FORMAT):
return datetime.strptime(date, format)
def to_string(date, format=DATE_FORMAT):
return date.strftime(format)
def dates_between(first, last):
date = parse_date(first)
last = parse_date(last)
next_day = timedelta(1)
while date <= last:
yield date
date += next_day
def main():
first = '01.01.17'
last = '28.02.17'
print([to_string(date) for date in dates_between(first, last)])
if __name__ == '__main__':
main()
- noisefloor
- User
- Beiträge: 3882
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
du machst dir aus deinem Start- und Enddatum ein `datetime` Objekt (mit Hilfe des `datetime` Moduls). Dann kannst du das Delta in Tagen berechnen. Jetzt kannst du dir mittels einer Schleife oder einer List Comprehension eine Liste von datetime-Objekten zwischen Start- und Enddatum bauen lassen. Und die Liste kannst du dann wieder in Strings im gewünschten Format umwandeln.
Gruß, noisefloor
[EDIT: snafu war schneller ]
du machst dir aus deinem Start- und Enddatum ein `datetime` Objekt (mit Hilfe des `datetime` Moduls). Dann kannst du das Delta in Tagen berechnen. Jetzt kannst du dir mittels einer Schleife oder einer List Comprehension eine Liste von datetime-Objekten zwischen Start- und Enddatum bauen lassen. Und die Liste kannst du dann wieder in Strings im gewünschten Format umwandeln.
Gruß, noisefloor
[EDIT: snafu war schneller ]
`dateutil` installieren und `rrule` verwenden:
Code: Alles auswählen
In [12]: from dateutil import rrule
In [13]: from datetime import date as Date
In [14]: ds = rrule.rrule(freq=rrule.DAILY, dtstart=Date(2017, 1, 1), until=Date(2017, 2, 28))
In [15]: ds.count()
Out[15]: 59
In [16]: list(ds)
Out[16]:
[datetime.datetime(2017, 1, 1, 0, 0),
datetime.datetime(2017, 1, 2, 0, 0),
datetime.datetime(2017, 1, 3, 0, 0),
datetime.datetime(2017, 1, 4, 0, 0),
datetime.datetime(2017, 1, 5, 0, 0),
datetime.datetime(2017, 1, 6, 0, 0),
datetime.datetime(2017, 1, 7, 0, 0),
datetime.datetime(2017, 1, 8, 0, 0),
datetime.datetime(2017, 1, 9, 0, 0),
datetime.datetime(2017, 1, 10, 0, 0),
datetime.datetime(2017, 1, 11, 0, 0),
datetime.datetime(2017, 1, 12, 0, 0),
datetime.datetime(2017, 1, 13, 0, 0),
datetime.datetime(2017, 1, 14, 0, 0),
datetime.datetime(2017, 1, 15, 0, 0),
datetime.datetime(2017, 1, 16, 0, 0),
datetime.datetime(2017, 1, 17, 0, 0),
datetime.datetime(2017, 1, 18, 0, 0),
datetime.datetime(2017, 1, 19, 0, 0),
datetime.datetime(2017, 1, 20, 0, 0),
datetime.datetime(2017, 1, 21, 0, 0),
datetime.datetime(2017, 1, 22, 0, 0),
datetime.datetime(2017, 1, 23, 0, 0),
datetime.datetime(2017, 1, 24, 0, 0),
datetime.datetime(2017, 1, 25, 0, 0),
datetime.datetime(2017, 1, 26, 0, 0),
datetime.datetime(2017, 1, 27, 0, 0),
datetime.datetime(2017, 1, 28, 0, 0),
datetime.datetime(2017, 1, 29, 0, 0),
datetime.datetime(2017, 1, 30, 0, 0),
datetime.datetime(2017, 1, 31, 0, 0),
datetime.datetime(2017, 2, 1, 0, 0),
datetime.datetime(2017, 2, 2, 0, 0),
datetime.datetime(2017, 2, 3, 0, 0),
datetime.datetime(2017, 2, 4, 0, 0),
datetime.datetime(2017, 2, 5, 0, 0),
datetime.datetime(2017, 2, 6, 0, 0),
datetime.datetime(2017, 2, 7, 0, 0),
datetime.datetime(2017, 2, 8, 0, 0),
datetime.datetime(2017, 2, 9, 0, 0),
datetime.datetime(2017, 2, 10, 0, 0),
datetime.datetime(2017, 2, 11, 0, 0),
datetime.datetime(2017, 2, 12, 0, 0),
datetime.datetime(2017, 2, 13, 0, 0),
datetime.datetime(2017, 2, 14, 0, 0),
datetime.datetime(2017, 2, 15, 0, 0),
datetime.datetime(2017, 2, 16, 0, 0),
datetime.datetime(2017, 2, 17, 0, 0),
datetime.datetime(2017, 2, 18, 0, 0),
datetime.datetime(2017, 2, 19, 0, 0),
datetime.datetime(2017, 2, 20, 0, 0),
datetime.datetime(2017, 2, 21, 0, 0),
datetime.datetime(2017, 2, 22, 0, 0),
datetime.datetime(2017, 2, 23, 0, 0),
datetime.datetime(2017, 2, 24, 0, 0),
datetime.datetime(2017, 2, 25, 0, 0),
datetime.datetime(2017, 2, 26, 0, 0),
datetime.datetime(2017, 2, 27, 0, 0),
datetime.datetime(2017, 2, 28, 0, 0)]
Hallo snafu,
wow!
Ich hätte nicht gedacht, dass es so kompliziert ist...
Ich habe es mit der for-Schleife versucht, aber solche Angaben wie 31.02.17 sind natürlich quatsch!
Danke schön!^^
Ich habe noch eine Frage: was macht der Befehl "yield date"?
wow!
Ich hätte nicht gedacht, dass es so kompliziert ist...
Ich habe es mit der for-Schleife versucht, aber solche Angaben wie 31.02.17 sind natürlich quatsch!
Danke schön!^^
Ich habe noch eine Frage: was macht der Befehl "yield date"?
- noisefloor
- User
- Beiträge: 3882
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Wenn du das schrittweise in der Kommandozeile machst kann da z.B. so aussehen:
[codebox=pycon file=Unbenannt.txt]
>>> import datetime
>>> start = datetime.date(2017, 1, 1)
>>> end = datetime.date(2017, 2, 28)
>>> delta = end - start
>>> my_list = [start + datetime.timedelta(days=x) for x in range(0, delta.days+1)]
>>> my_str_list = [x.strftime('%d.%m.%Y') for x in my_list][/code]
Gruß, noisefloor
Ist es auch nicht. Die Lösung von snafu ist nur universell und kommt mit beliebigen Daten aus.Ich hätte nicht gedacht, dass es so kompliziert ist...
Wenn du das schrittweise in der Kommandozeile machst kann da z.B. so aussehen:
[codebox=pycon file=Unbenannt.txt]
>>> import datetime
>>> start = datetime.date(2017, 1, 1)
>>> end = datetime.date(2017, 2, 28)
>>> delta = end - start
>>> my_list = [start + datetime.timedelta(days=x) for x in range(0, delta.days+1)]
>>> my_str_list = [x.strftime('%d.%m.%Y') for x in my_list][/code]
Gruß, noisefloor
Sofern es denn anfängerfreundlicher ist, hier einmal ohne Funktionen:
Code: Alles auswählen
from datetime import datetime, timedelta
DATE_FORMAT = '%d.%m.%y'
first = datetime.strptime('01.01.17', DATE_FORMAT)
last = datetime.strptime('28.02.17', DATE_FORMAT)
dates_between = [
(first + timedelta(days)).strftime(DATE_FORMAT)
for days in range((last - first).days + 1)
]
print(dates_between)