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()