[PYTHON] "Typfehler: Nicht erkannter Werttyp: <class'str '>" in to_datetime von Pandas

Dieser Fehler tritt auf, wenn eine Zeichenfolge enthalten ist, die nicht als Datum erkannt werden kann. Ich bin süchtig danach, also habe ich es im Artikel zusammengefasst.

Wenn beim Erstellen eines DataFrames zwischen den Datumszeichenfolgen ein "Nicht-Datumswert" steht, wird dieser als Objekt gelesen. (Wenn alle aus Zeichenfolgen bestehen, die als Datum interpretiert werden können, können sie als Datum / Uhrzeit gelesen werden.)

Beispielsweise wird in tatsächlichen Daten häufig ein Bindestrich (-) zwischen Datumsangaben eingefügt.

temp = pd.DataFrame(["2020-04-09", "2020-04-10", "-", "2020-04-12"], columns=["date"])
date
0 2020-04-09
1 2020-04-10
2 -
3 2020-04-12

Zu diesem Zeitpunkt tritt ein Fehler auf, wenn die Konvertierung in den Datetime-Typ durchgeführt wird.

pd.to_datetime(temp.date)

#Fehlerausgabe
TypeError: Unrecognized value type: <class 'str'>

Die Gegenmaßnahmen sind wie folgt.

Erzwinge die Ausführung von pd.to_datetime ()

Ignorieren Sie den Konvertierungsfehler und führen Sie ihn aus. Zu diesem Zeitpunkt ist der Teil der Umwandlung NG "NaT".

pd.to_datetime(temp.date, errors="coerce")

#Konvertierungsergebnis
0   2020-04-09
1   2020-04-10
2          NaT
3   2020-04-12
Name: date, dtype: datetime64[ns]

Ich denke, es ist in Ordnung, wenn Sie im Voraus verstehen, dass Bindestriche wie diesmal enthalten und ignoriert werden. Ich bin mir jedoch nicht sicher, habe aber einen Fehler erhalten. Daher ist es möglicherweise besser, die Verwendung zu vermeiden.

Korrigieren Sie die Daten, bevor Sie pd.to_datetime () ausführen.

Ersetzen oder entfernen Sie unnötige Zeichenfolgen korrekt im Voraus. Alternativ können Sie in der Datendatei- oder DB-Phase Maßnahmen ergreifen.

Ersetzen Sie beispielsweise den Bindestrich durch ein leeres Zeichen und führen Sie ihn aus. (Bei leeren Zeichen kann pd.to_datetime () die Ausführung abschließen, ohne eine Ausnahme zu überspringen.) Ähnlich wie bei der obigen erzwungenen Ausführung ist der NG-Teil der Konvertierung "NaT".

temp.date = temp.date.replace({"-":""})
pd.to_datetime(temp.date)

#Konvertierungsergebnis
0   2020-04-09
1   2020-04-10
2          NaT
3   2020-04-12
Name: date, dtype: datetime64[ns]

Eine einfache Möglichkeit, betrügerische Teile zu identifizieren

Im obigen Beispiel ist leicht zu erkennen, dass Bindestriche aufgrund der geringen Datenmenge eingemischt sind, es wird jedoch schwierig zu erfassen, wenn die Datenmenge groß ist. Mit dem folgenden Code können Sie beispielsweise leicht nach unzulässigen Zeichen suchen. Eine Ausnahme wird an der ersten falschen Stelle ausgelöst. Um alles zu überprüfen, wird die Überprüfung wiederholt, während der festsitzende Teil jedes Mal korrigiert wird. (Bitte beachten Sie, dass es eine enorme Aufgabe sein kann, wenn es zu viele Betrugsvarianten gibt.)

def check(x):
    print(x)
    pd.to_datetime(x)
    
temp.date.map(check)

das ist alles.

Recommended Posts

"Typfehler: Nicht erkannter Werttyp: <class'str '>" in to_datetime von Pandas
Funktionen von pd.NA in Pandas 1.0.0 (rc0)
Beurteilung von NaN durch Pandas: Wenn Str-Typ und Float-Typ gemischt werden
Zusammenfassung der häufig verwendeten Methoden bei Pandas
Die Geschichte eines Fehlers in PyOCR
Die Korrespondenz zu "Objekt: num kann nicht codiert werden, vom Typ: <class 'numpy.int64'>" im Pymongo-Fehler
Zusammenfassung dessen, was bei 100 Pandas-Schlägen verwendet wurde (# 1 ~ # 32)
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
pandas Gesamtzahl der Mitarbeiter Fehlende Wertvervollständigung
Der Header ist falsch ausgerichtet mit read_csv () und read_table () von Pandas
Suchen Sie nach dem Wert der Instanz in der Liste
Datum der bereits verwendeten Adresse Fehler in der Flasche