Immer noch: datum parsen problematisch/schlägt fehl

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
drnicolas
User
Beiträge: 98
Registriert: Sonntag 24. Juli 2016, 10:32

Ich muss aus einem text Datumsnagaben extrahieren.
Das ist mit allen probierten Methoden immer irgendwie problematisch

Ich wähnte mich am ziel als ich einen vermeinlich universellen regex-Ausdruck fand, der mir hilft alle möglichen Datumsformate zu entschlüsseln

mit diesem Codefragment wnalde ich alle gefundenen Daten in datetime um:

Code: Alles auswählen

re.MULTILINE
    for r in DATE_REGEX:
        for m in re.finditer(r, text):
            try:
                xx=parser.parse(m.group(0))
                if xx.year>2026:
                    xx=xx-relativedelta(years=100)
Jetzt schlägt das imperium anscheinend zurück:
Die Datumsangabe "10.3.88" (März) wird zu "3.10.1988" im datetime-Objekt geparst - der rest schlögt dann natürlich fehl

Ich kriege in den zu durchsuchenden texten leider alle möglichen Angaben. Da es deutsche texte sind, überiwegen zumindest die deutschen varianten - so auch hier.
Ausnahme ist eine neue Arthroskopie-Einheit die das Datum jeweils im ISO-Format angibt YYYY-MM-DD, aber auch YYYY/MM/DD

Gibt es da eine bessere Variante?
Benutzeravatar
sparrow
User
Beiträge: 4394
Registriert: Freitag 17. April 2009, 10:28

Bevor ich so etwas selber bauen würde, würde ich immer zuerst einen Blick auf dateparser werfen.
Das ist dir ja auch in einem anderen Thread schon einmal empfohlen worden.

Und nein, es gibt keine einfache Möglichkeit.
Auch das wurde in einem anderen Thread bereits gesagt.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1141
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Einen Studenten für 400€ beschäftigen, der die Daten manuell überprüft.

Das ist keine dankbare Aufgabe und wenn man meint, man hätte alle Eventualitäten abgedeckt, stößt man auf das nächste Problem, verursacht durch einen falschen Treffer.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
Kebap
User
Beiträge: 733
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Warum muss man dafür studieren?

Das ISO-Format ist zumindest eindeutig, ganz im Gegensatz zu "10/03/17", usw. dass alles mögliche bedeuten kann.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
__blackjack__
User
Beiträge: 13679
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kebap: Da weiss man wenigstens das derjenige formal zu einem Hochschulstudium befähigt ist, aber trotzdem 400€-Jobs annimmt. Kannst natürlich für 400€ auch irgendwen anstellen. 🙂
„Incorrect documentation is often worse than no documentation.“ — Bertrand Meyer
Benutzeravatar
DeaD_EyE
User
Beiträge: 1141
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Kebap hat geschrieben: Mittwoch 15. Mai 2024, 15:46 Warum muss man dafür studieren?
Meine Güte, seid ihr weltfremd. Wir haben ständig Studenten bei uns in der Firma. Manche waren als Hilfskraft angestellt (400€), andere haben ihren Bachelor oder Master bei uns gemacht.

Studenten sind billige Arbeitskräfte. Darum ging es. Der Computer kann nicht den Kontext der Daten interpretieren, der Student aber vielleicht schon. Es ist ein Unterschied, ob man sich nur ein Datum ansieht oder neben dem Datum noch andere verwertbare Daten zur Verfügung hat.

Ich würde ich zuerst alle Daten auslesen, die einen ISO8601 Zeitstempel haben.
Dann die restlichen Daten kategorisieren z.B. in Datum mit "/" als Trenner oder mit "." als Trenner.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
oldboyJR
User
Beiträge: 40
Registriert: Donnerstag 28. März 2024, 16:19

Könnte es simpel ein Sprachenparser sein der das Datum in das Gewünschte übersetzt? Beispiel Russisch zu Deutsch ? Herkunftsabhängiges Datumsformat? Mal so in die Diskussion geworfen :oops: :oops:
oldboyJR
User
Beiträge: 40
Registriert: Donnerstag 28. März 2024, 16:19

Bin gerade mit dem Thema: Formatierung von Strings und Platzhalter Listen beschäftigt und frage mich wie würde das aussehen wenn man alle Datumsangaben YYYY MM DD mit den verschiedenen Trennern verschiedenen erst in eine absolute Zahl umwandelt und dann mit hilfe von Liste und Platzhalter in das gewünschte Format überträgt.

Code: Alles auswählen

Datum_neu = "{dd}Tag, {mm}Monat, {yyyy}Jahr, .format(?, ?, ?, ?)
Sirius3
User
Beiträge: 18077
Registriert: Sonntag 21. Oktober 2012, 17:20

@oldboyJR: lies Dir am Besten die Dokumentation zum datetime-Modul durch. Dort wird erklärt, wie man Datumsangaben parst und auch wieder in Strings umwandelt.
oldboyJR
User
Beiträge: 40
Registriert: Donnerstag 28. März 2024, 16:19

Tja KI ist doch schlauer. Die Antwort hat mich schon erstaunt: Die Lösung: Im json modul gibt es ein modul datefinder der Datumsangaben aus Texten extrahiert. ( conda install -c conda-forge datefinder) und alle in datetime überführt. Verschiedene trenner werden umgewandelt.

Code: Alles auswählen

import datefinder

string_with_dates = """
Heute ist der 21. Mai 2024 und morgen ist der 22. Mai.
Nächstes Jahr am 2024-05-21 werden wir wieder feiern.
dieses ist mein zweiter Geburtstag 1956/03/10.
"""

matches = datefinder.find_dates(string_with_dates)
for match in matches:
    print(match)
Benutzeravatar
__blackjack__
User
Beiträge: 13679
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@oldboyJR: Also wenn die KI gesagt hat „Im json modul gibt es ein modul datefinder […]“ dann ist das nicht besonders schlau, weil offensichtlich falsch.

Und das Modul ist schlechter als das bereits vorgeschlagene `dateparser`. Es kann beispielsweise keine deutschsprachigen Monatsnamen.
„Incorrect documentation is often worse than no documentation.“ — Bertrand Meyer
Antworten