2017-01-19 5 views
2

Возможно ли использовать df.apply для получения атрибута, а не для запуска функции? Я хочу получить год с даты, чтобы выполнить группу. Например ..pandas применяются к атрибуту вместо функции

import pandas as pd 
import datetime 
import numpy as np 

df = pd.DataFrame({'date': [datetime.datetime(2010,1,1)+datetime.timedelta(days=i*15) 
for i in range(0,100)]}) 

Это работает ..

df['year'] = [d.year for d in df['date']] 

Это также работает ..

df['year'] = df['date'].apply(lambda x: x.year) 

Но это не ..

df['year'] = df['date'].apply(year) 

Нор делает это ..

df['year'] = df['date'].year 

Каков наиболее эффективный способ сделать это?

+4

Используйте '.dt' аксессор при доступе на серии объекта -' ДФ [ «дата»] dt.year'.. –

+1

Помимо вышеуказанного комментария, почему это 'df ['year'] = df ['date']. Apply (year)' work? 'year' должен быть определенным объектом или методом для применения к каждой строке, и именно поэтому вам не понадобилось' lambda' – EdChum

+0

@NickilMaveli. Это конкретное время? Если бы у меня был другой объект non datetime, к которому я хотел получить доступ к атрибуту, использую ли я лямбду или есть ярлык? – ashishsingal

ответ

2

Вы будете рады узнать, что существует целый набор функций, созданных для обеспечения изобилия атрибутов даты. Вы можете использовать аксессуар dt, чтобы получить множество атрибутов datetime. Его можно использовать только в сериях или индексах pandas, которые являются типами дат.

Вы можете увидеть все доступные атрибуты с помощью dir(df['date'].dt). Здесь они напечатаны ниже. В вашем случае просто использовать df['date'].dt.year

'ceil', 
'date', 
'day', 
'dayofweek', 
'dayofyear', 
'days_in_month', 
'daysinmonth', 
'floor', 
'freq', 
'hour', 
'is_leap_year', 
'is_month_end', 
'is_month_start', 
'is_quarter_end', 
'is_quarter_start', 
'is_year_end', 
'is_year_start', 
'microsecond', 
'minute', 
'month', 
'nanosecond', 
'normalize', 
'quarter', 
'round', 
'second', 
'strftime', 
'time', 
'to_period', 
'to_pydatetime', 
'tz', 
'tz_convert', 
'tz_localize', 
'week', 
'weekday', 
'weekday_name', 
'weekofyear', 
'year' 
+0

Спасибо Тед. Я надеялся, что что-то не 'datetime 'специфично, но работает для моей непосредственной проблемы. – ashishsingal