#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