Heute war ich positiv überrascht, dass Pandas beim Lesen von Daten aus einer Datendatei (zum Beispiel) Wertetypen erkennen kann:
df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3'])
Zum Beispiel kann es folgendermaßen überprüft werden:
for i, r in df.iterrows():
print type(r['col1']), type(r['col2']), type(r['col3'])
Insbesondere Ganzzahlen, Gleitkommazahlen und Zeichenfolgen wurden korrekt erkannt. Ich habe jedoch eine Spalte mit Datumsangaben im folgenden Format : 2013-6-4
. Diese Daten wurden als Zeichenfolgen erkannt (nicht als Python-Datumsobjekte). Gibt es eine Möglichkeit, Pandas zu anerkannten Daten zu "lernen"?
df.iterrows()
und für jede einzelne Zeile anzeigen, sondern nurdf.info()
einmal.Antworten:
Sie sollten hinzufügen
parse_dates=True
oderparse_dates=['column name']
beim Lesen, dass dies normalerweise ausreicht, um es auf magische Weise zu analysieren. Es gibt jedoch immer seltsame Formate, die manuell definiert werden müssen. In diesem Fall können Sie auch eine Datums-Parser-Funktion hinzufügen, die so flexibel wie möglich ist.Angenommen, Sie haben eine Spalte 'datetime' mit Ihrer Zeichenfolge, dann:
Auf diese Weise können Sie sogar mehrere Spalten zu einer einzigen Datum / Uhrzeit-Spalte kombinieren. Dadurch werden eine 'Datum'- und eine' Zeit'-Spalte zu einer einzigen 'Datum / Uhrzeit'-Spalte zusammengeführt:
Auf
strptime
undstrftime
auf dieser Seite finden Sie Anweisungen (dh die Buchstaben, die für verschiedene Formate verwendet werden sollen) .quelle
TypeError: strptime() argument 1 must be str, not float
infer_datetime_format
: "Pandas versuchen, das Format der Datums- / Uhrzeitzeichenfolgen in den Spalten abzuleiten". Dies kann anstelle von verwendet werdendate_parser
.ISO 8601
Format vorliegen, Sie keineinfer_datetime_format
Parser-Funktion übergeben sollten - dies ist viel langsamer, als wenn Pandas damit umgehen (insbesondere letzteres). Das Datumsformat in dieser Antwort fällt ebenfalls in diese KategorieMöglicherweise hat sich die Pandas-Oberfläche geändert, seit @Rutger geantwortet hat, aber in der von mir verwendeten Version (0.15.2)
date_parser
erhält die Funktion eine Liste mit Datumsangaben anstelle eines einzelnen Werts. In diesem Fall sollte sein Code folgendermaßen aktualisiert werden:quelle
Die Methode pandas read_csv eignet sich hervorragend zum Parsen von Daten. Vollständige Dokumentation unter http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html
Sie können sogar die verschiedenen Datumsteile in verschiedenen Spalten haben und den Parameter übergeben:
Die Standarderkennung von Datumsangaben funktioniert hervorragend, scheint jedoch auf nordamerikanische Datumsformate ausgerichtet zu sein. Wenn Sie woanders wohnen, werden Sie gelegentlich von den Ergebnissen überrascht. Soweit ich mich erinnern kann, bedeutet der 06.01.2000 den 6. Januar in den USA im Gegensatz zum 1. Juni, wo ich wohne. Es ist klug genug, sie herumzuschwingen, wenn Daten wie 23/6/2000 verwendet werden. Wahrscheinlich ist es jedoch sicherer, bei JJJJMMTT-Datumsvariationen zu bleiben. Entschuldigung an Pandas-Entwickler, aber ich habe es in letzter Zeit nicht mit lokalen Daten getestet.
Mit dem Parameter date_parser können Sie eine Funktion zum Konvertieren Ihres Formats übergeben.
quelle
dayfirst
für europäische / internationale Daten als True angeben . pandas.pydata.org/pandas-docs/stable/generated/…Sie können
pandas.to_datetime()
wie in der Dokumentation empfohlen Folgendes verwenden fürpandas.read_csv()
:Demo:
quelle
Beim Zusammenführen von zwei Spalten zu einer einzelnen Datums- / Uhrzeitspalte generiert die akzeptierte Antwort einen Fehler (Pandas Version 0.20.3), da die Spalten separat an die Funktion date_parser gesendet werden.
Folgendes funktioniert:
quelle
Ja - laut
pandas.read_csv
Dokumentation :Wenn Ihre CSV-Datei eine Spalte mit dem Namen hat
datetime
und das Datum beispielsweise so aussieht2013-01-01T01:01
, werden Pandas (ich bin in Version 0.19.2) das Datum und die Uhrzeit automatisch erfassen:df = pd.read_csv('test.csv', parse_dates=['datetime'])
Beachten Sie, dass Sie explizit übergeben müssen
parse_dates
, es funktioniert nicht ohne.Überprüfen Sie mit:
df.dtypes
Sie sollten sehen, dass der Datentyp der Spalte ist
datetime64[ns]
quelle
Wenn Ihnen die Leistung wichtig ist, stellen Sie sicher, dass Sie Zeit haben:
Drucke:
Bei einem iso8601-formatierten Datum (
%Y-%m-%d %H:%M:%S
anscheinend ein iso8601-formatiertes Datum, ich denke, das T kann gelöscht und durch ein Leerzeichen ersetzt werden) sollten Sie also nicht angebeninfer_datetime_format
(was bei allgemeineren offenbar auch keinen Unterschied macht) und Ihr eigenes übergeben Parser in nur lähmt Leistung. Auf der anderen Seitedate_parser
macht es einen Unterschied mit nicht so Standard-Tagesformaten. Stellen Sie sicher, dass Sie wie gewohnt Zeit haben, bevor Sie optimieren.quelle
Während des Ladens enthalten CSV-Datei Datumsspalte. Wir haben zwei Ansätze, um Pandas zu machen, um Datumsspalte zu erkennen, dh
Pandas erkennen das Format explizit an arg
date_parser=mydateparser
Pandas erkennen das Format implizit an agr
infer_datetime_format=True
Einige der Datumsspalten-Daten
01/01/18
01/02/18
Hier kennen wir die ersten beiden Dinge nicht. Es kann Monat oder Tag sein. In diesem Fall müssen wir also Methode 1 verwenden: - Explizites Übergeben des Formats
Methode 2: - Das Format implizit oder automatisch erkennen
quelle