Seite 1 von 1

Aus Zeichenkette Datum erstellen

Verfasst: Samstag 20. Februar 2021, 21:36
von Elemack
Hallo zusammen.
Ich möchte in ECODMS automatisch Kontoauszüge erfassen.
Auf dem Kontoauszug steht leider kein Datum sondern nur z.B. 10/2020.
Würde jetzt gerne daraus 01.10.2020 machen. Als Tag möchte ich immer den 1. nehmen. Monat und Jahr aus der Zeichenkette.
Der zu erkennende Text sieht immer so aus: Kontoauszug Nr. 10/2020
Zwischen Kontoauszug und Nr. gibt es einige Leereichen, genauso wie zwischen Nr. und der Monatsangabe.
Ich würde mich freuen wenn mir jemand sagt wie man das macht.
Danke schon mal im Voraus.

Re: Aus Zeichenkette Datum erstellen

Verfasst: Samstag 20. Februar 2021, 22:18
von snafu
So in etwa?

Code: Alles auswählen

from datetime import datetime

def get_datestring(text):
    date = datetime.strptime(text.split()[-1], "%m/%Y")
    return date.strftime("%d.%m.%Y")

print(get_datestring("Kontoauszug Nr. 10/2020"))

Re: Aus Zeichenkette Datum erstellen

Verfasst: Montag 22. Februar 2021, 13:51
von DeaD_EyE

Code: Alles auswählen

def parse_datestring(text):
    month, year = map(int, text.split("/"))
    return datetime.date(year, month, 1)


def localize_date(date):
    return date.strftime("%d.%m.%Y")

Re: Aus Zeichenkette Datum erstellen

Verfasst: Montag 22. Februar 2021, 14:00
von Sirius3
@DeaD_EyE: warum sollte man nicht datetime.strptime benutzen, wenn es das gibt?

Re: Aus Zeichenkette Datum erstellen

Verfasst: Dienstag 13. April 2021, 17:03
von DeaD_EyE
Sirius3 hat geschrieben: Montag 22. Februar 2021, 14:00 @DeaD_EyE: warum sollte man nicht datetime.strptime benutzen, wenn es das gibt?
Wer redet von nicht sollen?

Es ist einfach nur ein anderer falscher Weg.
Witzig, dass niemanden aufgefallen ist, dass die Funktion nur den String "monat/jahr" verarbeiten kann, aber nicht mit "Kontoauszug " davor.
Mir missfällt z.B. das text.split()[-1]
Es mag auch nicht jeder Spinat-Pizza.

Aber das hat alles nichts mit der Methode strptime, strftime zu tun. Sie sind da und sollten auch verwendet werden.

Re: Aus Zeichenkette Datum erstellen

Verfasst: Dienstag 13. April 2021, 17:34
von snafu
Gut, aber wie soll man den Kontoauszug oder anderen Text davor sonst weg kriegen? Regex ginge noch und könnte dann sogar Text danach ignorieren. Dass es soviel sein muss, ging aus der ursprünglichen Frage jedoch nicht hervor. Bei split()[-1] weiß jeder mit Grundkenntnissen, dass der letzte Part behandelt wird, egal wieviel davor steht. Auch ohne Text davor klappt dieser Ansatz.

Re: Aus Zeichenkette Datum erstellen

Verfasst: Dienstag 13. April 2021, 19:06
von DeaD_EyE
snafu hat geschrieben: Dienstag 13. April 2021, 17:34 Regex ginge noch und könnte dann sogar Text danach ignorieren. Dass es soviel sein muss, ging aus der ursprünglichen Frage jedoch nicht hervor.
Regex ist mit Kanonen auf Spatzen schießen, bei einer so einfachen Aufgabe.
Da ist split oder rsplit schon die richtige Methode.
snafu hat geschrieben: Dienstag 13. April 2021, 17:34 Bei split()[-1] weiß jeder mit Grundkenntnissen, dass der letzte Part behandelt wird, egal wieviel davor steht. Auch ohne Text davor klappt dieser Ansatz.
Ändert aber nichts daran, dass ich das [-1] hässlich finde.

Anstatt das:

Code: Alles auswählen

# das maxsplit lasse ich mal drin
datum_text = text.split(maxsplit=1)[-1]
Bevorzuge ich eher das:

Code: Alles auswählen

*_, datum_text = text.rsplit(maxsplit=1)
PS: Wenn ich von rechts was brauche, nutze ich rsplit. Wenn ich von links etwas brauche, nutze ich split. Wenn ich weiß, dass ich nur 2 Elemente als Ergebnis benötige, nutze ich den Parameter maxsplit.

Re: Aus Zeichenkette Datum erstellen

Verfasst: Dienstag 13. April 2021, 19:13
von Sirius3
Und was soll * vor _?

Re: Aus Zeichenkette Datum erstellen

Verfasst: Donnerstag 10. Juni 2021, 09:08
von DeaD_EyE
* Ist ein Fehler.
Anstatt einen str, ist _ dann eine Liste mit einem str als einziges Element.

Dass * vor dem _ alles an übrig gebliebenen Elementen konsumiert, ist dir bekannt?
Ich kann mich nicht mehr erinnern wann es eingeführt worden ist, aber es müsste diese PEP sein: https://www.python.org/dev/peps/pep-3132/