Извлечение только месяца и года отдельно от столбца Pandas Datetime

У меня есть Dataframe, df, со следующим столбцом:

df['ArrivalDate'] =
...
936   2012-12-31
938   2012-12-29
965   2012-12-31
966   2012-12-31
967   2012-12-31
968   2012-12-31
969   2012-12-31
970   2012-12-29
971   2012-12-31
972   2012-12-29
973   2012-12-29
...

Элементы столбца pandas.tslib.Timestamp.

Я хочу просто включить год и месяц. Я думал, что будет простой способ сделать это, но я не могу понять это.

Вот что я пробовал:

df['ArrivalDate'].resample('M', how = 'mean')

Я получил следующую ошибку:

Only valid with DatetimeIndex or PeriodIndex 

Затем я попытался:

df['ArrivalDate'].apply(lambda(x):x[:-2])

Я получил следующую ошибку:

'Timestamp' object has no attribute '__getitem__' 

Любые предложения?

Изменить: Я как-то понял.

df.index = df['ArrivalDate']

Затем я могу выполнить повторный выбор другого столбца с помощью индекса.

Но мне все равно нужен способ переконфигурировать весь столбец. Любые идеи?

Ответ 1

Вы можете напрямую получить доступ к атрибутам year и month или запросить datetime.datetime:

In [15]: t = pandas.tslib.Timestamp.now()

In [16]: t
Out[16]: Timestamp('2014-08-05 14:49:39.643701', tz=None)

In [17]: t.to_pydatetime() #datetime method is deprecated
Out[17]: datetime.datetime(2014, 8, 5, 14, 49, 39, 643701)

In [18]: t.day
Out[18]: 5

In [19]: t.month
Out[19]: 8

In [20]: t.year
Out[20]: 2014

Один из способов объединить год и месяц - создать целочисленную кодировку, например: 201408 за август 2014 года. В целом по столбцу вы можете сделать это следующим образом:

df['YearMonth'] = df['ArrivalDate'].map(lambda x: 100*x.year + x.month)

или много их вариантов.

Я не большой поклонник этого, хотя, поскольку это делает выравнивание даты и арифметику болезненными позже и особенно болезненными для тех, кто сталкивается с вашим кодом или данными без этого же соглашения. Лучший способ - выбрать соглашение о дне месяца, например, окончательный день недели, кроме выходных, или первый день и т.д., И оставить данные в формате даты/времени с выбранным соглашением о дате.

Модуль calendar полезен для получения числовых значений определенных дней, таких как последний день недели. Тогда вы можете сделать что-то вроде:

import calendar
import datetime
df['AdjustedDateToEndOfMonth'] = df['ArrivalDate'].map(
    lambda x: datetime.datetime(
        x.year,
        x.month,
        max(calendar.monthcalendar(x.year, x.month)[-1][:5])
    )
)

Если вы ищете способ решить более простую проблему простого форматирования столбца datetime в некоторое строковое представление, для этого вы можете просто использовать функцию strftime из класса datetime.datetime, например так:

In [5]: df
Out[5]: 
            date_time
0 2014-10-17 22:00:03

In [6]: df.date_time
Out[6]: 
0   2014-10-17 22:00:03
Name: date_time, dtype: datetime64[ns]

In [7]: df.date_time.map(lambda x: x.strftime('%Y-%m-%d'))
Out[7]: 
0    2014-10-17
Name: date_time, dtype: object

Ответ 2

Если вы хотите, чтобы новые столбцы показывали год и месяц отдельно, вы можете сделать это:

df['year'] = pd.DatetimeIndex(df['ArrivalDate']).year
df['month'] = pd.DatetimeIndex(df['ArrivalDate']).month

или...

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

Затем вы можете комбинировать их или работать с ними так, как они есть.

Ответ 3

Лучший способ найден !

df['date_column'] должен быть в формате даты и времени.

df['month_year'] = df['date_column'].dt.to_period('M')

Вы можете также использовать D для дня, 2M в течение 2 месяцев и т.д. для различных интервалов выборки, и в случае, если один имеет данные временные ряды с отметкой времени, мы можем пойти на гранулированные интервалы дискретизации, такие как 45Min в течение 45 мин, 15Min в течение 15 мин выборки и т.п.

Ответ 4

Если вам нужна уникальная пара месяц-год, используйте apply довольно гладко.

df['mnth_yr'] = df['date_column'].apply(lambda x: x.strftime('%B-%Y')) 

Выводит месяц-год в одном столбце.

Не забудьте сначала изменить формат на дату и время, как правило, я забываю.

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

Ответ 5

Извлечение слова года из ['2018-03-04']

df['Year'] = pd.DatetimeIndex(df['date']).year  

DF ['Year'] создает новый столбец. Хотя, если вы хотите извлечь месяц, просто используйте .month

Ответ 6

Сначала вы можете преобразовать свои строки дат с помощью pandas.to_datetime, который предоставляет вам доступ ко всем множественным функциям datetime и timedelta. Например:

df['ArrivalDate'] = pandas.to_datetime(df['ArrivalDate'])
df['Month'] = df['ArrivalDate'].values.astype('datetime64[M]')

Ответ 7

Благодаря jaknap32 я хотел объединить результаты в соответствии с Годом и Месяцем, поэтому это сработало:

df_join['YearMonth'] = df_join['timestamp'].apply(lambda x:x.strftime('%Y%m'))

Выход был опрятным:

0    201108
1    201108
2    201108

Ответ 8

Решение @KieranPC является правильным подходом для Pandas, но его нелегко расширить для произвольных атрибутов. Для этого вы можете использовать getattr в генераторе и комбинировать, используя pd.concat:

list_of_dates = ['2012-12-31', '2012-12-29', '2012-12-30']
df = pd.DataFrame({'ArrivalDate': pd.to_datetime(list_of_dates)})

L = ['year', 'month', 'day', 'dayofweek', 'dayofyear', 'weekofyear', 'quarter']
df = df.join(pd.concat((getattr(df['ArrivalDate'].dt, i).rename(i) for i in L), axis=1))

print(df)

  ArrivalDate  year  month  day  dayofweek  dayofyear  weekofyear  quarter
0  2012-12-31  2012     12   31          0        366           1        4
1  2012-12-29  2012     12   29          5        364          52        4
2  2012-12-30  2012     12   30          6        365          52        4

Ответ 9

df['year_month']=df.datetime_column.apply(lambda x: str(x)[:7])

Это сработало для меня, не думал, что pandas интерпретирует итоговую строковую дату как дату, но когда я сделал сюжет, он очень хорошо знал мою повестку дня и строку year_month, где было упорядочено правильно... gotta love pandas!

Ответ 10

Существует два шага для извлечения года для всех данных без использования метода apply.

Шаг1

преобразовать столбец в дату и время:

df['ArrivalDate']=pd.to_datetime(df['ArrivalDate'], format='%Y-%m-%d')

Step2

извлечь год или месяц, используя метод DatetimeIndex()

 pd.DatetimeIndex(df['ArrivalDate']).year