Атрибут доступа к каждому объекту в столбце фрейма данных pandas

#python #pandas

#python #pandas

Вопрос:

Рассмотрим следующий mwe:

 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])
  

Я могу получить доступ к month атрибуту одной даты следующим образом:

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

Однако df.Date.month не возвращает вектор, содержащий все месяцы, как я ожидал. Вместо этого он выдает мне ошибку:

Ошибка атрибута: объект ‘Series’ не имеет атрибута ‘month’

Есть ли хороший способ выполнить это без необходимости перебора фрейма данных?

Ответ №1:

Вам нужно сначала преобразовать to_datetime , а затем использовать dt.month :

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

Другое более медленное решение с apply :

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

Тайминги:

 #[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
  

Комментарии:

1. Спасибо, это было в точку! Я не знал о разнице между type(df.Date[0]) Out[39]: datetime.date и type(pd.to_datetime(df.Date)[0]) Out[41]: pandas.tslib.Timestamp