Преобразование длительных дат в кварталы (с прописной буквы с периодами)

#python #pandas #numpy

Вопрос:

У меня есть фрейм данных, df, в котором я хотел бы преобразовать длинные даты в соответствующие кварталы.

Данные

 id  date
a   10/1/2021
a   10/1/2021
a   7/1/2021
b   1/1/2021
b   2/1/2022
 

Желанный

 id  date
a   Q4.21
a   Q4.21
a   Q3.21
b   Q1.21
b   Q1.22
 

Делающий

Я полагаю, что в python встроен этот скрипт преобразования. Однако я не уверен, как изменить формат, заглавные буквы и включить точку.

 df['date'] = pd.PeriodIndex(df.date, freq='Q')
 

Вывод следующего кода является:

 id  date
a   2021Q4
a   2021Q4
a   2021Q3
b   2022Q1
b   2022Q1
 

Однако это не тот результат, который я хотел бы получить.
Любое понимание или предложения приветствуются.

Комментарии:

1. pandas.pydata.org/docs/reference/api/…

Ответ №1:

Используйте Period.strftime и укажите строку формата:

 df['date'] = pd.PeriodIndex(df['date'], freq='Q').strftime('Q%q.%y')
 

df :

   id   date
0  a  Q4.21
1  a  Q4.21
2  a  Q3.21
3  b  Q1.21
4  b  Q1.22
 

Ответ №2:

Попробуйте объединить столбцы строк при извлечении соответствующих компонентов.

 df['qtr'] = 'Q'   df['date'].dt.quarter.astype(str)   '.' 
      df['date'].dt.strftime('%y')

df
  id       date    qtr
0  a 2021-10-01  Q4.21
1  a 2021-10-01  Q4.21
2  a 2021-07-01  Q3.21
3  b 2021-01-01  Q1.21
4  b 2022-02-01  Q1.22
 

Причина , по которой я выбрал это, заключается в том, что извлечение номера квартала с помощью Q%q.%y , как я впервые попытался, не работало на моем компьютере. Я локализовал проблему %q на своем компьютере ( %y работает нормально).

Комментарии:

1. Period.strftime Имеет доступ только к %q . dt.strftime имеет доступ только к стандартным strftime параметрам (которые не включают %q . Этот метод должен df['date'] был бы иметь тип datetime , в то время PeriodIndex как принимал бы столбец как есть.

2. Я написал свой ответ против первоначальной версии вопроса, которая не имела ничего общего с индексом периода. В нем был только столбец даты в формате MDY.

3. Я понимаю. Я просто пытался сказать, что Q%q.%y это не работает на вашей машине, потому что (я предполагаю), что вы пытались df['date'].dt.strftime('Q%q.%y') , что не сработало бы. Это не проблема конкретно с %q вашим компьютером.