2016-08-24 1 views
2

Aus der Dokumentation von Pandas http://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_datetime.html eine Anordnung von mehreren Säulen, z.B. Datumsspalten zu einem einzigen wird erläutert.Pandas zerlegen Säule

>>> df = pd.DataFrame({'year': [2015, 2016], 
         'month': [2, 3], 
         'day': [4, 5]}) 
>>> pd.to_datetime(df) 
0 2015-02-04 1 2016-03-05 dtype: datetime64[ns] 

Aber wie kann ich die umgekehrte Umwandlung durchführen?

+0

Leider was ist die gewünschte Ausgabe? Sie möchten die Datetime auf ihre Bestandteile aufteilen? Sie können "df ['Jahr'], df ['Monat'], df ['Tag'] = df ['Datum']. dt.year, df ['Datum']. dt.month, df [' Datum ']. Dt.day' – EdChum

+0

Danke. Dies ist die gewünschte Ausgabe. –

Antwort

1

.dt.strftime('%Y %-m %-d').str.split() wird die Operation umkehren

df = pd.DataFrame({'year': [2015, 2016], 
         'month': [2, 3], 
         'day': [4, 5]}) 
pd.to_datetime(df) 

0 2015-02-04 
1 2016-03-05 
dtype: datetime64[ns] 

pd.to_datetime(df).dt.strftime('%Y %-m %-d').str.split() 

0 [2015, 2, 4] 
1 [2016, 3, 5] 
dtype: object 

Oder mit einem extravaganten regex Extrakt

regex = r'(?P<year>\d+) (?P<month>\d+) (?P<day>\d+)' 
pd.to_datetime(df).dt.strftime('%Y %-m %-d') \ 
    .str.extract(regex, expand=True).astype(int) 

enter image description here

2

können Sie die konstituierenden Zugriff auf Teile eines Datums mit dem dt Accessor, beachten Sie, dass to_datetime gibt ein Series so zu einer df um ich Umwandlung Spalten hinzufügen:

In [71]: 
df1 = pd.to_datetime(df) 
df1 = df1.to_frame() 
df1 = df1.rename(columns={0:'date'}) 
df1 

Out[71]: 
     date 
0 2015-02-04 
1 2016-03-05 

In [72]: 
df1['year'], df1['month'], df1['day'] = df1['date'].dt.year, df1['date'].dt.month, df1['date'].dt.day 
df1 

Out[72]: 
     date year month day 
0 2015-02-04 2015  2 4 
1 2016-03-05 2016  3 5 

die dtypes werden int64 für jede Komponente:

In [73]:  
df1.info() 

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 2 entries, 0 to 1 
Data columns (total 4 columns): 
date  2 non-null datetime64[ns] 
year  2 non-null int64 
month 2 non-null int64 
day  2 non-null int64 
dtypes: datetime64[ns](1), int64(3) 
memory usage: 144.0 bytes 
+0

Alternativ können Sie die Komponenten auch über 'df1.date.apply (operator.attrgetter ('Jahr', 'Monat', 'Tag'))' –

+0

@ JonClements bekommen, was prägnanter wäre, aber ich rate immer von 'apply' ab Wenn eine vektorisierte Lösung existiert, obwohl ich es rätselhaft finde, warum manche '.str'- und' .dt'-Operationen langsamer zu sein scheinen als 'apply' oder' map', würde das auch ein Tupel zurückgeben, so dass es nötig wäre auf jedes Element zugreifen – EdChum