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.
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.
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]
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