2D list in Spalte das Datum umwandel/replace

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
AstroCom
User
Beiträge: 8
Registriert: Sonntag 22. November 2020, 21:12

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 :?: :?: :?:
ElektroBerry
User
Beiträge: 31
Registriert: Samstag 16. Mai 2020, 18:52

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
Benutzeravatar
__blackjack__
User
Beiträge: 14020
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
AstroCom
User
Beiträge: 8
Registriert: Sonntag 22. November 2020, 21:12

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...
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

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
]
Antworten