Seite 1 von 1

Eine Liste mit Daten zwischen zwei Datumsangaben.

Verfasst: Freitag 3. Februar 2017, 17:57
von reddy
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?

Re: Eine Liste mit Daten zwischen zwei Datumsangaben.

Verfasst: Freitag 3. Februar 2017, 18:28
von snafu

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()

Re: Eine Liste mit Daten zwischen zwei Datumsangaben.

Verfasst: Freitag 3. Februar 2017, 18:31
von noisefloor
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 :-)]

Re: Eine Liste mit Daten zwischen zwei Datumsangaben.

Verfasst: Freitag 3. Februar 2017, 18:32
von 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)]

Re: Eine Liste mit Daten zwischen zwei Datumsangaben.

Verfasst: Freitag 3. Februar 2017, 18:39
von reddy
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"?

Re: Eine Liste mit Daten zwischen zwei Datumsangaben.

Verfasst: Freitag 3. Februar 2017, 18:48
von reddy
Danke schön BlackJack!
Dein Code funzt auch sehr gut.
*Jubel*

Re: Eine Liste mit Daten zwischen zwei Datumsangaben.

Verfasst: Freitag 3. Februar 2017, 19:29
von noisefloor
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

Re: Eine Liste mit Daten zwischen zwei Datumsangaben.

Verfasst: Freitag 3. Februar 2017, 20:32
von snafu
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)

Re: Eine Liste mit Daten zwischen zwei Datumsangaben.

Verfasst: Freitag 3. Februar 2017, 21:10
von reddy
Danke schön an alle nochmal.
Jetzt muss ich echt erstmal nachdenken...:-)