Формат pandas datetimeindex для кварталов

dr jerry спросил: 28 марта 2018 в 01:54 в: python

С заданием resample у меня есть месячные значения, пересчитанные в квартальные значения:

hs=hs.resample('QS',axis=1).mean()

Хорошо работает, мои столбцы выглядят следующим образом:

hs.columns:
DatetimeIndex(['2000-01-01', '2000-04-01', '2000-07-01', '2000-10-01',
           '2001-01-01', '2001-04-01', '2001-07-01', '2001-10-01',
           '2002-01-01', '2002-04-01', '2002-07-01', '2002-10-01',

Теперь я хочу, чтобы они конвертировали в формате YYYYq [1-4], который, как я думал, должен быть таким же простым, как (согласно этой ссылке):

hs.columns.strftime('%Yq%q')

Но это дает:

array(['2000qq', '2000qq', '2000qq', '2000qq', '2001qq', '2001qq',
   '2001qq', '2001qq', '2002qq', '2002qq', '2002qq', '2002qq',
   '2003qq', '2003qq', '2003qq', '2003qq', '2004qq', '2004qq',

Где я ошибаюсь и как это исправить?


2 ответа

Есть решение
Psidom ответил: 28 марта 2018 в 02:13

В документации указан тип данных strftime для Period , а не для типа Datetime ; Чтобы использовать форматировщик %q, вы можете преобразовать индекс даты и времени в период (дни в единицах), а затем отформатировать его:

cols = pd.DatetimeIndex(['2000-01-01', '2000-04-01', '2000-07-01', '2000-10-01',
                         '2001-01-01', '2001-04-01', '2001-07-01', '2001-10-01',
                         '2002-01-01', '2002-04-01', '2002-07-01', '2002-10-01'])cols.to_period('D').strftime('%Yq%q')
# hs.columns.to_period('D').strftime('%Yq%q')
#array([u'2000q1', u'2000q2', u'2000q3', u'2000q4', u'2001q1', u'2001q2',
#       u'2001q3', u'2001q4', u'2002q1', u'2002q2', u'2002q3', u'2002q4'],
#      dtype='<U6')

Или просто используйте to_period с Q (квартал) в качестве единицы измерения:

cols.to_period('Q')
# hs.columns.to_period('Q')
#PeriodIndex(['2000Q1', '2000Q2', '2000Q3', '2000Q4', '2001Q1', '2001Q2',
#             '2001Q3', '2001Q4', '2002Q1', '2002Q2', '2002Q3', '2002Q4'],
#            dtype='period[Q-DEC]', freq='Q-DEC')
jpp ответил: 28 марта 2018 в 02:09

Один из способов использовать pd.Series.dt.to_period:

df = pd.DataFrame(columns=['2000-01-01', '2000-04-01', '2000-07-01', '2000-10-01',
                           '2001-01-01', '2001-04-01', '2001-07-01', '2001-10-01',
                           '2002-01-01', '2002-04-01', '2002-07-01', '2002-10-01'])df.columns = pd.to_datetime(df.columns.to_series()).dt.to_period('Q')print(df.columns)# PeriodIndex(['2000Q1', '2000Q2', '2000Q3', '2000Q4', '2001Q1', '2001Q2',
#              '2001Q3', '2001Q4', '2002Q1', '2002Q2', '2002Q3', '2002Q4'],
#             dtype='period[Q-DEC]', freq='Q-DEC')