Извлечение только месяца и года из столбца Pandas Datetime (Python)
у меня есть фрейм данных, 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
...
элементы столбца-панды.tslib.Отметка времени.
Я хочу просто указать год и месяц. Я думал, что будет простой способ сделать это, но я не могу понять это.
вот что я пробовал:
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__'
какие предложения?
Edit: я вроде как понял это.
df.index = df['ArrivalDate']
затем я могу пересчитать другой столбец, используя индекс.
но я все равно хотел бы метод для перенастройки всего столбца. Есть идеи?
8 ответов:
доступ в интернет
yearиmonthатрибуты, или запрос adatetime.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_datetime() 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)или множество его вариантов.
Я не большой поклонник этого, хотя, поскольку это делает выравнивание даты и арифметику болезненными позже и особенно болезненными для других, которые приходят ваш код или данные без этого же соглашения. Лучший способ-выбрать день месяца, например, последний день недели, не являющийся выходным днем США, или первый день и т. д., и оставьте данные в формате даты / времени с выбранным соглашением о дате.
The
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
Если вы хотите, чтобы новые столбцы показывали год и месяц отдельно, вы можете сделать это:
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затем вы можете комбинировать их или работать с ними так же, как они.
лучший способ найти!!
the
date_columnдолжна быть в формате даты и времени.df['month_year'] = df.date_column.dt.to_period('M')вы также можете использовать
Dв день,2Mна 2 месяца etc. для различных интервалов выборки, и в случае, если у вас есть данные временных рядов с отметкой времени, мы можем пойти на гранулированные интервалы выборки, такие как45Minв течение 45 мин,15Minдля 15-минутного отбора проб и т. д.
Если вы хотите, чтобы месяц год уникальная пара, используя применить довольно гладкий.
df['mnth_yr'] = df['date_column'].apply(lambda x: x.strftime('%B-%Y'))выходы месяц-год в одном столбце.
Не забудьте сначала изменить формат на дату-время Раньше, я вообще забываю :/
df['date_column'] = pd.to_datetime(df['date_column'])
спасибо jaknap32, Я хотел собрать результаты по годам и месяцам, так что это сработало:
df_join['YearMonth'] = df_join['timestamp'].apply(lambda x:x.strftime('%Y%m'))вывод был аккуратным:
0 201108 1 201108 2 201108
извлечение года говорят из ['2018-03-04']
df['Year'] = pd.DatetimeIndex(df['date']).yeardf ['Year'] создает новый столбец. В то время как если вы хотите извлечь месяц просто использовать .месяц
вы можете сначала преобразовать строки даты сpandas. to_datetime, что дает вам доступ ко всем numpy datetime и timedelta услуги. Например:
df['ArrivalDate'] = pandas.to_datetime(df['ArrivalDate']) df['Month'] = df['ArrivalDate'].values.astype('datetime64[M]')
df['year_month']=df.datetime_column.apply(lambda x: str(x)[:7])это отлично работало для меня, не думал, что панды будут интерпретировать полученную строку date как date, но когда я сделал сюжет, он очень хорошо знал мою повестку дня и строку year_month, где заказано правильно... надо любить панд!
Comments