2016-10-24 2 views
1

Betrachten Sie das folgende MWe:Zugang atribute jedes Objekt in Pandas Datenrahmen Spalte

import pandas as pd 
from decimal import * 
from datetime import date 

d1={'Date':date(2016,10,24),'Value':Decimal(20)} 
d2={'Date':date(2016,10,25),'Value':Decimal(10)} 
d3={'Date':date(2016,9,25),'Value':Decimal(50)} 
d4={'Date':date(2016,9,24),'Value':Decimal(5)} 

df=pd.DataFrame([d1,d2,d3,d4]) 

ich in der Lage bin, das month Attribut eines einzigen Zeitpunkt, um auf die folgende Art und Weise:

df.Date[0].month 
Out[22]: 10 

jedoch df.Date.month gibt keinen Vektor zurück, der alle Monate enthält, wie ich es erwarten würde. Stattdessen wirft es mir einen Fehler:

AttributeError: 'Series' object has no attribute 'month'

Gibt es eine nette Möglichkeit, dies zu erreichen, ohne über den Datenrahmen zu iterieren?

Antwort

3

Sie müssen zuerst to_datetime konvertieren und dann verwenden dt.month:

print (pd.to_datetime(df.Date).dt.month) 
0 10 
1 10 
2  9 
3  9 
Name: Date, dtype: int64 

Eine weitere slowier Lösung mit apply:

print (df.Date.apply(lambda x: x.month)) 
0 10 
1 10 
2  9 
3  9 
Name: Date, dtype: int64 

Timings:

#[40000 rows x 2 columns] 
df = pd.concat([df]*10000).reset_index(drop=True) 

In [292]: %timeit (df.Date.apply(lambda x: x.month)) 
100 loops, best of 3: 15.8 ms per loop 

In [293]: %timeit (pd.to_datetime(df.Date).dt.month) 
100 loops, best of 3: 5.44 ms per loop 
+0

Danke, das war genau richtig ! Ich war mir nicht bewusst über den Unterschied zwischen 'type (df.Date [0]) Out [39]: datetime.date' und' type (pd.to_datetime (df.Date) [0]) Out [41]: pandas.tslib.Timestamp' – brodoll

Verwandte Themen