Probleme mit unvollständigen Datumswerten in CSV

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Ylmar
User
Beiträge: 1
Registriert: Montag 13. Oktober 2025, 11:33
Wohnort: https://gritt.io/

Hey zusammen,

bin eigentlich JS-Dev, aber auf dem aktuellen Projekt muss ich ne ziemlich große CSV mit Investment-Daten analysieren. Hab das in Colab mit Python gemacht, bisschen rumprobiert mit pandas, aber ehrlich gesagt... kaum Plan davon. Das CSV hat so 80k Zeilen, aber manche Zeilen haben kein komplettes Datum – manchmal fehlt das Jahr, manchmal nur der Monat. Wollte das auffüllen mit irgendwas Standardmäßigem, aber die Formatierung bricht mir alles.

Code: Alles auswählen

import pandas as pd

df = pd.read_csv("invest_data.csv")
df["date"] = pd.to_datetime(df["date"], errors="coerce")
df["date"] = df["date"].fillna(method="ffill")

print(df.head(10))
Das fillna(method="ffill") macht zwar was, aber bei Datumsangaben wie 03-15 ohne Jahr kommt nur NaT. Hatte versucht, einfach 2024- vorne dran zu hängen mit nem apply(lambda x: ...), aber dann hab ich plötzlich Strings und datetime durcheinander. Brauch ne simple Lösung, wie man so halb kaputte Datumsfelder aufräumt, ohne dass alles explodiert.

Danke schon mal!
mechanicalStore
User
Beiträge: 188
Registriert: Dienstag 29. Dezember 2009, 00:09

Sicher stellen, dass das Format richtig interpretiert wird (die für Dich gültigen Formate in der List angeben) und nichts ungültiges mehr in den Zeilen steht.

Code: Alles auswählen

import pandas as pd

pd.set_option("display.max_rows", None)

def parse_date(val):
    if pd.isna(val):
        return pd.NaT
    val_str = str(val).replace(',', '.').strip()
    for fmt in ("%Y-%m-%dT%H:%M:%S.%fZ", "%Y-%m-%dT%H:%M:%SZ", "%d.%m.%Y %H:%M:%S.%f", "%d.%m.%Y %H:%M:%S"):
        try:
            return pd.to_datetime(val_str, format=fmt, errors="coerce")
        except Exception:
            continue
    return pd.NaT


def main():

    df = pd.read_csv('test.csv', sep=';', dtype=str, keep_default_na=False)
    series = (
        df['example_dates']
        .astype("string")
        .str.strip()
        .replace({"": pd.NA, "nan": pd.NA, "None": pd.NA, "NULL": pd.NA})
    )

    df['example_dates'] = series.map(parse_date)
    df["example_dates"] = df["example_dates"].ffill()

    print(df)
    print(df.dtypes)

if __name__ == '__main__':
    main()
Dein

Code: Alles auswählen

 .fillna(method="ffill") 
ist außerdem deprecated, Du solltest

Code: Alles auswählen

.ffill()
benutzen.
Benutzeravatar
__blackjack__
User
Beiträge: 14236
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das ``continue`` macht nichts was nicht auch ein ``pass`` machen würde.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Antworten