Ich habe einen riesigen Datenrahmen mit vielen Spalten, von denen viele vom Typ sind datetime.datetime
. Das Problem ist, dass viele auch gemischte Typen haben, einschließlich zum Beispiel datetime.datetime
Werte und None
Werte (und möglicherweise andere ungültige Werte):
0 2017-07-06 00:00:00
1 2018-02-27 21:30:05
2 2017-04-12 00:00:00
3 2017-05-21 22:05:00
4 2018-01-22 00:00:00
...
352867 2019-10-04 00:00:00
352868 None
352869 some_string
Name: colx, Length: 352872, dtype: object
Daraus ergibt sich eine object
Typenspalte. Dies kann mit gelöst werden df.colx.fillna(pd.NaT)
. Das Problem ist, dass der Datenrahmen zu groß ist, um nach einzelnen Spalten zu suchen.
Ein anderer Ansatz ist die Verwendung pd.to_datetime(col, errors='coerce')
, dies wird jedoch in datetime
viele Spalten umgewandelt, die numerische Werte enthalten.
Ich könnte es auch tun df.fillna(float('nan'), inplace=True)
, obwohl die Spalten, die Datumsangaben enthalten, immer noch vom object
Typ sind und immer noch das gleiche Problem haben würden.
Welchen Ansatz könnte ich verfolgen, um die Spalten, deren Werte tatsächlich Werte enthalten datetime
, aber auch None
und möglicherweise einige ungültige Werte enthalten könnten, auf datetime umzuwandeln (da ansonsten a pd.to_datetime
in a erwähnt wird)try
/ except
-Klausel dies tun würde)? So etwas wie eine flexible Version vonpd.to_datetime(col)
datetime.datetime
oderpandas._libs.tslibs.timestamps.Timestamp
? In diesem Fall würde ich empfehlen, die Datums- und Uhrzeitangabe auf den Typ zu ändern, derpandas
etwas besser funktioniert .None
in Ihren Spalten tatsächlichenNone
oder Zeichenfolgenvertreter davon?None
keine Schnur. Möglicherweise kann es auch falsche Werte geben ... @erfandatetime
undvalues
darin enthalten ist?Antworten:
Das Hauptproblem, das ich sehe, ist das Parsen von numerischen Werten.
Ich würde vorschlagen, sie zuerst in Zeichenfolgen umzuwandeln
Installieren
Lösung
quelle
pd.to_datetime
undcoerce
die Fehler, da es viele gibt. Das Problem war mit den numerischen Spalten. Mir ist aber nicht in den Sinn gekommen, dass numerische Spalten, die in Zeichenfolgen umgewandelt werden, nicht von Pandas analysiert werdento_datetime
. Vielen Dank, das hilft wirklich!Diese Funktion setzt den Datentyp einer Spalte auf datetime, wenn ein Wert in der Spalte mit dem Regex-Muster (\ d {4} - \ d {2} - \ d {2}) + übereinstimmt (z. B. 01.01.2019) ). Wir danken dieser Antwort für die Suche nach Zeichenfolgen in allen Pandas DataFrame-Spalten und -Filtern , die beim Festlegen und Anwenden der Maske hilfreich waren.
Arbeiten aus dem Vorschlag zu verwenden
dateutil
kann dies hilfreich sein. Es wird immer noch davon ausgegangen, dass die Spalte eine datetime sein sollte, wenn in einer Spalte datumsähnliche Werte vorhanden sind. Ich habe versucht, verschiedene Datenrahmen-Iterationsmethoden in Betracht zu ziehen, die schneller sind. Ich denke, diese Antwort zum Durchlaufen von Zeilen in einem DataFrame in Pandas hat gute Arbeit geleistet, um sie zu beschreiben.Beachten Sie, dass
dateutil.parser
der aktuelle Tag oder das aktuelle Jahr für Zeichenfolgen wie "Dezember" oder "November 2019" ohne Jahres- oder Tageswerte verwendet wird.Wenn Sie auch die Datenzeitwerte von verwenden möchten
dateutil.parser
, können Sie Folgendes hinzufügen:quelle
dateutil
sieht das von @Serge erwähnte Modul so aus, als könnte es nützlich sein.dateutil.parse
viele verschiedene Arten von Datumszeichenfolgen identifiziert.