Знание формата to_datetime
, необходимого для передачи индексов периодов, полезно (оно соответствует YYYY-QX
), поэтому мы начинаем с replace
, затем to_datetime
и, наконец, strftime
:
u = df.Quarter.str.replace(r'(Q\d)_(\d+)', r'20\2-\1')
pd.to_datetime(u).dt.strftime('%b-%Y')
0 Jan-2001
1 Apr-2001
2 Jul-2001
3 Oct-2001
4 Jan-2002
5 Apr-2002
Name: Quarter, dtype: object
Месяц представляет собой начало соответствующего квартала.
Если даты могут варьироваться между 90-ми и 2000-ми годами, давайте попробуем что-то другое:
df = pd.DataFrame({'Quarter':['Q1_98','Q2_99', 'Q3_01', 'Q4_01', 'Q1_02','Q2_02']})
dt = pd.to_datetime(df.Quarter.str.replace(r'(Q\d)_(\d+)', r'\2-\1'))
(dt.where(dt <= pd.to_datetime('today'), dt - pd.DateOffset(years=100))
.dt.strftime('%b-%Y'))
0 Jan-1998
1 Apr-1999
2 Jul-2001
3 Oct-2001
4 Jan-2002
5 Apr-2002
Name: Quarter, dtype: object
pd.to_datetime
автоматически анализирует «98» как «2098», поэтому мы исправим небольшую поправку, чтобы вычесть 100 лет из дат позже, чем «сегодняшняя дата».
Этот хак перестанет работать через несколько десятилетий.Боги, панды, помилуйте мою душу :-)
Другой вариант - синтаксический анализ PeriodIndex
:
(pd.PeriodIndex(df.Quarter.str.replace(r'(Q\d)_(\d+)', r'20\2-\1'), freq='Q')
.strftime('%b-%Y'))
# Index(['Mar-2001', 'Jun-2001', 'Sep-2001',
# 'Dec-2001', 'Mar-2002', 'Jun-2002'], dtype='object')
Здесь распечатанные месяцы заканчиваютсяих соответствующие кварталы.Вы сами решаете, что использовать.