python pandas extract year from datetime --- df['year'] = df['date'].year is not working

Sorry for this question that seems repetitive - I expect the answer will make me feel like a bonehead... but I have not had any luck using answers to the similar questions on SO.

I am importing data in through read_csv, but for some reason which I cannot figure out, I am not able to extract the year or month from the dataframe series df['date'].

    date    Count
    6/30/2010   525
    7/30/2010   136
    8/31/2010   125
    9/30/2010   84
    10/29/2010  4469

    df = pd.read_csv('sample_data.csv',parse_dates=True)

    df['date'] = pd.to_datetime(df['date'])

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

But this returns:

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

Thanks in advance.

UPDATE:

    df = pd.read_csv('sample_data.csv',parse_dates=True)

    df['date'] = pd.to_datetime(df['date'])

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

this generates the same "AttributeError: 'Series' object has no attribute 'dt' "

FOLLOW UP:

I am using Spyder 2.3.1 with Python 3.4.1 64bit, but cannot update pandas to a newer release (currently on 0.14.1). Each of the following generates an invalid syntax error:

    conda update pandas

    conda install pandas==0.15.2

    conda install -f pandas

Any ideas?

If you're running a recent-ish version of pandas then you can use the datetime attribute dt to access the datetime components:

    In [6]:

    df['date'] = pd.to_datetime(df['date'])
    df['year'], df['month'] = df['date'].dt.year, df['date'].dt.month
    df
    Out[6]:
            date  Count  year  month
    0 2010-06-30    525  2010      6
    1 2010-07-30    136  2010      7
    2 2010-08-31    125  2010      8
    3 2010-09-30     84  2010      9
    4 2010-10-29   4469  2010     10

EDIT

It looks like you're running an older version of pandas in which case the following would work:

    In [18]:

    df['date'] = pd.to_datetime(df['date'])
    df['year'], df['month'] = df['date'].apply(lambda x: x.year), df['date'].apply(lambda x: x.month)
    df
    Out[18]:
            date  Count  year  month
    0 2010-06-30    525  2010      6
    1 2010-07-30    136  2010      7
    2 2010-08-31    125  2010      8
    3 2010-09-30     84  2010      9
    4 2010-10-29   4469  2010     10

Regarding why it didn't parse this into a datetime in read_csv you need to pass the ordinal position of your column ([0]) because when True it tries to parse columns [1,2,3] see the docs

    In [20]:

    t="""date   Count
    6/30/2010   525
    7/30/2010   136
    8/31/2010   125
    9/30/2010   84
    10/29/2010  4469"""
    df = pd.read_csv(io.StringIO(t), sep='\s+', parse_dates=[0])
    df.info()
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 5 entries, 0 to 4
    Data columns (total 2 columns):
    date     5 non-null datetime64[ns]
    Count    5 non-null int64
    dtypes: datetime64[ns](1), int64(1)
    memory usage: 120.0 bytes

So if you pass param parse_dates=[0] to read_csv there shouldn't be any need to call to_datetime on the 'date' column after loading.

From: stackoverflow.com/q/30405413