У меня есть 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']
Затем я могу пересчитать другой столбец, используя индекс.
Но я все еще хотел бы метод для перенастройки всего столбца. Любые идеи?
to_period
:df.date_column.dt.month
(или.year
, или.day
) работает.dt.month
теряет год, хотя. И.dt.to_period('M')
изменяет тип данных на что-то, что больше не является datetime64. В итоге я воспользовался ответом Хуана, предложив.astype('datetime64[M]')
усечь значения.Ответы:
Если вы хотите, чтобы новые столбцы отображали год и месяц отдельно, вы можете сделать это:
или...
Тогда вы можете объединить их или работать с ними, как они есть.
источник
timeit
предполагает , чтоDatetimeIndex
подход значительно быстрее , чем любой.map/.apply
или.dt
.df['date_column_trunc'] = df[date_column'].apply(lambda s: datetime.date(s.year, s.month, 1)
Лучший способ найден !
df['date_column']
должно быть в формате дата и время.Вы также можете использовать «
D
День», «2M
2 месяца» и т. Д. Для разных интервалов выборки, и если у вас есть данные временного ряда с отметкой времени, мы можем выбрать гранулированные интервалы выборки, например,45Min
45 минут,15Min
15 минут выборки и т. Д.источник
datetime64
типу dtype. Использованиеdf.my_date_column.astype('datetime64[M]')
, как в ответе @ Juan, конвертирует в даты, представляющие первый день каждого месяца.Вы можете сразу получить доступ к
year
иmonth
атрибуты, или запроситьdatetime.datetime
:Один из способов объединить год и месяц - создать целочисленную кодировку, например,
201408
на август 2014 года. В целом по столбцу вы можете сделать это следующим образом:или много их вариантов.
Однако я не большой поклонник этого, так как это делает выравнивание даты и арифметику болезненными позже и особенно болезненными для тех, кто сталкивается с вашим кодом или данными без этого соглашения. Лучший способ - выбрать соглашение о дне месяца, например, окончательный день недели, кроме выходных, или первый день и т. Д., И оставить данные в формате даты / времени с выбранным соглашением о дате.
calendar
Модуль является полезным для получения значения числа определенных дней , таких как окончательный день недели. Тогда вы можете сделать что-то вроде:Если вы ищете способ решить более простую проблему простого форматирования столбца datetime в некоторое строковое представление, для этого вы можете просто использовать
strftime
функцию изdatetime.datetime
класса, например так:источник
pandas
методы разделения-применения-объединения. Мои предложения, приведенные выше, не должны восприниматься как подтверждение того, что они являются наиболее эффективными подходами для вашего случая - просто они являются стилистически обоснованными вариантами Pythonic для ряда случаев.df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month)
.Если вы хотите уникальную пару месяца и года, используйте apply довольно гладко.
Выводит месяц-год в одну колонку.
Не забудьте сначала поменять формат на дату-время раньше, я вообще забываю.
источник
df['month_year'] = df['date_column'].dt.strftime('%B-%Y')
Извлечение слова года из ['2018-03-04']
DF ['Year'] создает новый столбец. Хотя, если вы хотите извлечь месяц, просто используйте .month
источник
Вы можете сначала преобразовать ваши строки даты с pandas.to_datetime , который дает вам доступ ко всем многочисленным функциям datetime и timedelta . Например:
источник
trunc
. Есть ли документация дляastype('datetime64[M]')
конвенции?Благодаря jaknap32 я хотел объединить результаты по годам и месяцам, так что это сработало:
Вывод был аккуратным:
источник
Решение @ KieranPC является правильным подходом для Pandas, но его нелегко расширить для произвольных атрибутов. Для этого вы можете использовать
getattr
в генераторе понимание и комбинировать, используяpd.concat
:источник
Это работало хорошо для меня, не думал, что панды будут интерпретировать полученную строковую дату как дату, но когда я делал сюжет, он очень хорошо знал мою повестку дня и строку year_month, где все было упорядочено должным образом ... должен любить панд!
источник
Существует два шага для извлечения года для всех данных без использования метода apply.
Шаг 1
преобразовать столбец в datetime:
Шаг 2
извлечь год или месяц, используя
DatetimeIndex()
методисточник
ОДИНОЧНАЯ ЛИНИЯ: Добавление столбца с парами 'year-month': ('pd.to_datetime' сначала изменяет столбец dtype на date-time перед операцией)
Соответственно для дополнительного столбца «год» или «месяц»:
источник