fix: Datumsspalten mit Uhrzeit werden auch ohne passendes Format erkannt
Der Revolut-Export führt "2026-01-06 23:11:14" in der Datumsspalte. Wählte man
im Dropdown JJJJ-MM-TT, scheiterte das Parsen an der Uhrzeit – jede Zeile hatte
kein Datum und galt als ungültig ("137 Zeilen erkannt, 0 werden gebucht"),
obwohl die Auswahl richtig aussah.
- parse_date schneidet eine überzählige Uhrzeit ab und kommt auch damit klar,
wenn das Format eine Uhrzeit erwartet, der Wert aber keine hat (ISO-T ebenso)
- Dropdown um die Varianten mit Uhrzeit ergänzt, damit die Bank-Vorlagen ihren
echten Eintrag zeigen statt eines leeren Feldes
- Test: reines Datumsformat auf Datei mit Uhrzeit -> alle Zeilen erkannt, 84 grün
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -99,13 +99,34 @@ def parse_amount(raw: str | None, decimal_sep: str) -> int | None:
|
||||
|
||||
|
||||
def parse_date(raw: str | None, fmt: str) -> date | None:
|
||||
"""Datumstext -> Datum. Nachsichtig gegenüber einer Uhrzeit, die im Format
|
||||
fehlt oder umgekehrt: Banken exportieren dieselbe Spalte mal als „2026-01-06",
|
||||
mal als „2026-01-06 23:11:14" (auch mit Sekundenbruchteilen). Sonst müsste man
|
||||
im Dropdown für jede Variante ein eigenes Format anbieten."""
|
||||
s = str(raw or "").strip()
|
||||
if not s:
|
||||
return None
|
||||
try:
|
||||
return datetime.strptime(s, fmt).date()
|
||||
except ValueError:
|
||||
return None
|
||||
pass
|
||||
|
||||
hat_zeit_im_format = any(x in fmt for x in ("%H", "%M", "%S", "%f"))
|
||||
# Wert bringt eine Uhrzeit mit, das Format kennt keine -> nur den Datumsteil.
|
||||
if not hat_zeit_im_format and (" " in s or "T" in s):
|
||||
kopf = s.replace("T", " ").split(" ", 1)[0]
|
||||
try:
|
||||
return datetime.strptime(kopf, fmt).date()
|
||||
except ValueError:
|
||||
pass
|
||||
# Format erwartet eine Uhrzeit, der Wert hat keine -> Format kürzen.
|
||||
if hat_zeit_im_format:
|
||||
nur_datum = fmt.replace("T", " ").split(" ", 1)[0]
|
||||
try:
|
||||
return datetime.strptime(s.replace("T", " ").split(" ", 1)[0], nur_datum).date()
|
||||
except ValueError:
|
||||
pass
|
||||
return None
|
||||
|
||||
|
||||
def decode_bytes(data: bytes, encoding: str) -> str:
|
||||
|
||||
Reference in New Issue
Block a user