Python pandas извлечь год из datetime --- df ['year'] = df ['date']. year не работает

Извините за этот вопрос, который кажется повторяющимся - я ожидаю, что ответ заставит меня почувствовать себя болваном... но мне не удавалось использовать ответы на подобные вопросы в SO.

Я импортирую данные через read_csv, но по какой-то причине, которую я не могу понять, я не могу извлечь год или месяц из серии dataframe 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

Но это возвращает:

AttributeError: объект 'Series' не имеет атрибута 'year'

Спасибо заранее.

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

это генерирует тот же объект "AttributeError:" Series ", у которого нет атрибута" dt "

ПОСЛЕДОВАТЕЛЬНОСТЬ:

Я использую Spyder 2.3.1 с Python 3.4.1 64bit, но не могу обновить pandas до более новой версии (в настоящее время на 0.14.1). Каждое из следующего генерирует недопустимую синтаксическую ошибку:

conda update pandas

conda install pandas==0.15.2

conda install -f pandas

Ответы

Ответ 1

Если вы используете обновленную версию pandas, то вы можете использовать атрибут datetime dt для доступа к компонентам datetime:

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

ИЗМЕНИТЬ

Похоже, вы используете более старую версию pandas, и в этом случае будет работать следующее:

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

Относительно того, почему он не анализировал это в datetime в read_csv, вам нужно передать порядковое положение вашего столбца ([0]), потому что, когда True пытается проанализировать столбцы [1,2,3], см. 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

Итак, если вы передадите param parse_dates=[0] в read_csv, после загрузки не должно быть необходимости вызывать to_datetime в столбце 'date'.

Ответ 2

Это работает:

df['date'].dt.year

Сейчас:

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

предоставляет этот фрейм данных:

        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

Ответ 3

Для меня работала модернизация pandas до последней версии:

Из командной строки выполните:

conda update pandas

Ответ 4

Когда использовать dt Accessor

Распространенный источник путаницы вращается вокруг того, когда использовать .year и когда использовать .dt.year.

Первый является атрибутом для объектов pd.DatetimeIndex; последний для объектов pd.Series. Рассмотрим этот кадр данных:

df = pd.DataFrame({'Dates': pd.to_datetime(['2018-01-01', '2018-10-20', '2018-12-25'])},
                  index=pd.to_datetime(['2000-01-01', '2000-01-02', '2000-01-03']))

Определение ряда и индекса выглядит аналогично, но конструктор pd.DataFrame преобразует их в различные типы:

type(df.index)     # pandas.tseries.index.DatetimeIndex
type(df['Dates'])  # pandas.core.series.Series

Объект DatetimeIndex имеет прямой атрибут year, а объект Series должен использовать метод доступа dt. Аналогично за month:

df.index.month               # array([1, 1, 1])
df['Dates'].dt.month.values  # array([ 1, 10, 12], dtype=int64)

Тонкое, но важное отличие, которое стоит отметить, состоит в том, что df.index.month дает массив NumPy, а df['Dates'].dt.month дает ряд Pandas. Выше мы используем pd.Series.values для извлечения представления массива NumPy.

Ответ 5

20010101
20010101
20010201
20010201
20011121
20011121
20011221

У меня есть 55k строк дат, мне нужно извлечь и указать количество месяцев, недель и дней, например

Feb-2001    4
Jul-2002    3
Nov-2014    7

Код ниже дает мне всего 12 месяцев на оси X, мне нужно 180 месяцев (с 2001 по 2015 год)

import pandas as pd
import matplotlib.pyplot as plt 
from datetime import datetime
df = pd.read_csv('rr.csv') 
df['COLLISION_DATE'] = pd.to_datetime(df['COLLISION_DATE'],format='%Y%m%d')
df['week'], df['month'], df['year'],df['day'] = df['COLLISION_DATE'].dt.week, df['COLLISION_DATE'].dt.month, df['COLLISION_DATE'].dt.year,df['COLLISION_DATE'].dt.day
answer = df.groupby('month').size().to_frame('Number of Accidents') 
answer.plot.line()
plt.show()