Конвертируйте строки периода Q1-Q4 в datetime, используя панд - PullRequest
0 голосов
/ 29 декабря 2018

Вот пример с форматом даты:

data = pd.DataFrame({'Quarter':['Q1_01','Q2_01', 'Q3_01', 'Q4_01', 'Q1_02','Q2_02']
                     , 'Sale' :[10, 20, 30, 40, 50, 60]})

print(data)

#   Quarter  Sale
#0  Q1_01    10
#1  Q2_01    20
#2  Q3_01    30
#3  Q4_01    40
#4  Q1_02    50
#5  Q2_02    60

print(data.dtypes)
# Quarter    object
# Sale        int64

Хотелось бы преобразовать столбец Quarter в формат даты и времени Pandas, например ' Jan-2001 ' или ' 01-2001 ', который можно использовать в fbProphet для анализа временных рядов.

Попытка с использованием strptime, но с ошибкой TypeError: strptime() argument 1 must be str, not Series

from datetime import datetime

data['Quarter'] = datetime.strptime(data['Quarter'], 'Q%q_%y')

В чем причина ошибки?Есть лучшее решение?

1 Ответ

0 голосов
/ 29 декабря 2018

Знание формата 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')

Здесь распечатанные месяцы заканчиваютсяих соответствующие кварталы.Вы сами решаете, что использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...