Reputation: 2978
Is it possible to use df.apply to get an attribute as opposed to running a function? I want to retrieve the year from a date to perform a groupby. For example ..
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)]})
This works ..
df['year'] = [d.year for d in df['date']]
This also works ..
df['year'] = df['date'].apply(lambda x: x.year)
But this does not ..
df['year'] = df['date'].apply(year)
Nor does this ..
df['year'] = df['date'].year
What is the most efficient way of doing this?
Upvotes: 5
Views: 2150
Reputation: 61967
You will be happy to know there is an entire set of functionality built to provide an abundance of date attributes. You can use the dt
accessor to get many datetime attributes. It can only be used on pandas series or indexes that are date types.
You can see all the available attributes with dir(df['date'].dt)
. Here they are printed out below. In your case simply use 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'
Upvotes: 4