Seite 1 von 1

2D list in Spalte das Datum umwandel/replace

Verfasst: Samstag 28. November 2020, 13:26
von AstroCom
Hallo zusammen,

momentan bin ich wirklich ratlos. Ich möchte gerne aus der list das Datum in der ersten Spalte von DD.MM.YYYY auf YYYY-MM-DD umstellen. Dafür bediene ich mich an "datetime.strptime" und so sieht der Code aus:

Code: Alles auswählen

onlineumsaetze = [['21.11.2020', 'P35314369001', '9,90', '-'], ['11.11.2020', 'EDUN  / INGOLSTADT', '3,85', '-'], ['11.11.2020', 'PAHANDELSGE  / 35314369001', '36,24', '-']]

for n, row in enumerate(onlineumsaetze):
    onlineumsaetze.insert(0,((str(datetime.strptime((onlineumsaetze[1*n][0]), "%d.%m.%Y")))[:10]))
    del row[0]
Das Problem ist das das ganze in einer Endlos schleife hinausläuft. mit While hat ich keinen Erfolg…
Aber wenn ich das ganze in einer neuen list einfüge geht es siehe:

Code: Alles auswählen

onlineumsaetze = [['21.11.2020', 'P35314369001', '9,90', '-'], ['11.11.2020', 'EDUN  / INGOLSTADT', '3,85', '-'], ['11.11.2020', 'PAHANDELSGE  / 35314369001', '36,24', '-']]
newonlineumsaetze=[]

for n, row in enumerate(onlineumsaetze):
    newonlineumsaetze.insert(0,((str(datetime.strptime((onlineumsaetze[1*n][0]), "%d.%m.%Y")))[:10]))
    del row[0]
Was mache ich falsch :?: :?: :?:

Re: 2D list in Spalte das Datum umwandel/replace

Verfasst: Samstag 28. November 2020, 14:37
von ElektroBerry
Man soll niemals eine Liste verändern, während man sie in einem Loop benutzt.
Sondern man muss in dem Fall, mit einer Listenkopie arbeiten.

Code: Alles auswählen

for i in liste:  # FALSCH
    if "XYZ" in i:  # FALSCH
        liste.remove(i)  # FALSCH
Ein Lösungsvorschlag ist dies hier:

Code: Alles auswählen

for i in liste[:]:  # RICHTIG
    if "XYZ" in i:  # RICHTIG
    liste.remove(i)  # RICHTIG
Listen richtig kopieren:

Code: Alles auswählen

**Falscher Weg:**  
Liste_neu = Liste_alt
Wird nicht funktionieren, weil hier nur der Verweis auf die Daten kopiert wird.
Wird "Liste_alt" verändert, verändert sich auch "Liste_neu".

Code: Alles auswählen

**Richtiger Weg:**  
Liste_neu = Liste_alt.copy()  
Dies funktioniert.

Code: Alles auswählen

Liste_neu = Liste_alt[:]
Funktioniert auch. Hier wurde die Liste durch, "slicing" kopiert

Re: 2D list in Spalte das Datum umwandel/replace

Verfasst: Samstag 28. November 2020, 14:56
von __blackjack__
@AstroCom: ich würde die Rückrichtung bei der Datumsformatierung explizit mit einem Format machen, dann wird dem Leser deutlicher was da passiert.

Erstelle eine neue Liste, und zwar nicht in dem Du vorher kopierst und dann doch wieder mit Indexwerten arbeitest, sondern baue eine neue Liste auf. In so einfachen Fälle wie hier, wo sich das neue Listenelement durch einen einfachen Ausdruck erstellen lässt, bietet sich die „list comprehension“ an:

Code: Alles auswählen

#!/usr/bin/env python3
from datetime import datetime as DateTime
from pprint import pprint


def main():
    onlineumsaetze = [
        ["21.11.2020", "P35314369001", "9,90", "-"],
        ["11.11.2020", "EDUN  / INGOLSTADT", "3,85", "-"],
        ["11.11.2020", "PAHANDELSGE  / 35314369001", "36,24", "-"],
    ]
    result = [
        [DateTime.strptime(date, "%d.%m.%Y").strftime("%Y-%m-%d"), *tail]
        for date, *tail in onlineumsaetze
    ]
    pprint(result)


if __name__ == "__main__":
    main()

Re: 2D list in Spalte das Datum umwandel/replace

Verfasst: Samstag 28. November 2020, 18:07
von AstroCom
Nun dann bleibt wohl nichts anderes übrig als eine temporäre oder eine kopie der list weiter zuarbeiten.


Habe den Code nun so geschrieben:

Code: Alles auswählen

result = [
    [datetime.strptime(date, "%d.%m.%Y").strftime("%Y-%m-%d"), *tail]
    for date, *tail in onlineumsaetze
]
onlineumsaetze = result[:]

Die Funktion (def) habe ich raus genommen. Und das "__name__ == __main__" müsste ich noch einlesen was es macht und wofür es da ist;)
Danke euch...

Re: 2D list in Spalte das Datum umwandel/replace

Verfasst: Samstag 28. November 2020, 18:15
von Sirius3
Die letzte Zeile ist unnötig und kopiert die Liste nur noch einmal.

Code: Alles auswählen

onlineumsaetze = [
    [datetime.strptime(date, "%d.%m.%Y").strftime("%Y-%m-%d"), *tail]
    for date, *tail in onlineumsaetze
]