Извлечение только месяца и года из столбца 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']


затем я могу пересчитать другой столбец, используя индекс.



но я все равно хотел бы метод для перенастройки всего столбца. Есть идеи?

21810   8  

8 ответов:

доступ в интернет year и month атрибуты, или запрос a 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_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']).year  

df ['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

    Ничего не найдено.