Eine Liste mit Daten zwischen zwei Datumsangaben.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
reddy
User
Beiträge: 21
Registriert: Donnerstag 17. März 2016, 23:29

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?
Benutzeravatar
snafu
User
Beiträge: 6750
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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()
Benutzeravatar
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 :-)]
BlackJack

`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)]
reddy
User
Beiträge: 21
Registriert: Donnerstag 17. März 2016, 23:29

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"?
reddy
User
Beiträge: 21
Registriert: Donnerstag 17. März 2016, 23:29

Danke schön BlackJack!
Dein Code funzt auch sehr gut.
*Jubel*
Benutzeravatar
noisefloor
User
Beiträge: 3882
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich hätte nicht gedacht, dass es so kompliziert ist...
Ist es auch nicht. Die Lösung von snafu ist nur universell und kommt mit beliebigen Daten aus.

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
Benutzeravatar
snafu
User
Beiträge: 6750
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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)
reddy
User
Beiträge: 21
Registriert: Donnerstag 17. März 2016, 23:29

Danke schön an alle nochmal.
Jetzt muss ich echt erstmal nachdenken...:-)
Antworten