it-swarm.com.de

Angabe des Datumsformats bei der Konvertierung mit pandas.to_datetime

Ich habe Daten in einer CSV-Datei mit Datumsangaben, die als Zeichenfolgen in einem UK-Standardformat gespeichert sind - %d/%m/%Y - das heißt, sie sehen aus wie:

12/01/2012
30/01/2012

Die obigen Beispiele beziehen sich auf den 12. Januar 2012 und den 30. Januar 2012.

Wenn ich diese Daten mit pandas version 0.11.0 importiere, habe ich die folgende Transformation angewendet:

import pandas as pd
...
cpts.Date = cpts.Date.apply(pd.to_datetime)

aber es konvertierte Daten inkonsistent. Um mein vorhandenes Beispiel zu verwenden, würde 12/01/2012 als Datums-/Uhrzeitobjekt konvertiert, das den 1. Dezember 2012 darstellt, aber 30/01/2012 wird als 30. Januar 2012 konvertiert, was ich möchte.

Nach einem Blick auf diese Frage habe ich versucht:

cpts.Date = cpts.Date.apply(pd.to_datetime, format='%d/%m/%Y')

aber die ergebnisse sind genau die gleichen. Der Quellcode legt nahe, dass ich die Dinge richtig mache, so dass ich ratlos bin. Weiß jemand, was ich falsch mache?

21
cms_mgr

Sie können die Option parse_dates Von read_csv Verwenden, um die Konvertierung direkt beim Lesen Ihrer Daten durchzuführen.
Der Trick hier ist, mit dayfirst=True Anzugeben, dass Ihre Daten mit dem Tag und nicht mit dem Monat beginnen. Weitere Informationen finden Sie hier: http://pandas.pydata.org/pandas-docs/dev/generated/pandas.io.parsers.read_csv.html

Wenn Ihre Daten der Index sein müssen:

>>> import pandas as pd
>>> from StringIO import StringIO
>>> s = StringIO("""date,value
... 12/01/2012,1
... 12/01/2012,2
... 30/01/2012,3""")
>>> 
>>> pd.read_csv(s, index_col=0, parse_dates=True, dayfirst=True)
            value
date             
2012-01-12      1
2012-01-12      2
2012-01-30      3

Oder wenn sich Ihre Daten nur in einer bestimmten Spalte befinden:

>>> s = StringIO("""date
... 12/01/2012
... 12/01/2012
... 30/01/2012""")
>>> 
>>> pd.read_csv(s, parse_dates=[0], dayfirst=True)
                 date
0 2012-01-12 00:00:00
1 2012-01-12 00:00:00
2 2012-01-30 00:00:00
22
joris

Ich denke, Sie nennen es richtig und ich habe dies als ein Problem bei Github gepostet.

Sie können das Format einfach direkt auf to_datetime Festlegen, zum Beispiel:

In [1]: s = pd.Series(['12/1/2012', '30/01/2012'])

In [2]: pd.to_datetime(s, format='%d/%m/%Y')
Out[2]:
0   2012-01-12 00:00:00
1   2012-01-30 00:00:00
dtype: datetime64[ns]

Update: Wie OP richtig feststellt, funktioniert dies nicht mit NaN, wenn Sie mit dayfirst=True Zufrieden sind (was auch mit NaN funktioniert):

s.apply(pd.to_datetime, dayfirst=True)

Beachten Sie, dass bei der Verwendung von dayfirst (was einfacher ist als das genaue Format anzugeben) Vorsicht geboten ist, da dayfirst nicht streng ist .

10
Andy Hayden