Python — получить год политики из datetime dataframe

#python #pandas #dataframe

#python #pandas #dataframe

Вопрос:

У меня есть dataframe (df) со столбцом в формате datetime ГГГГ-ММ-ДД (‘дата’). Я пытаюсь создать новый столбец, который возвращает год политики, который всегда начинается с 1 апреля, и, таким образом, год политики с января по март всегда будет годом предыдущего календаря. Существуют довольно старые даты, поэтому настройка отдельных диапазонов дат для приведенного ниже размера выборки не была бы идеальной

Фрейм данных будет выглядеть следующим образом

 df['date']

    2020-12-10
    2021-02-10 
    2019-03-31
 

и вывод должен выглядеть следующим образом

 2020 
2020 
2018
 

Теперь я знаю, как получить год с помощью df['date'].dt.year . Однако у меня возникают проблемы с преобразованием фрейма данных каждый год в соответствующий год политики, чтобы if df['date'].dt.month >= 4 затем df['date'].dt.year , else df['date'].dt.year - 1

Я не совсем уверен, как это точно настроить. Я пытался избежать настройки нескольких столбцов для выполнения bool для месяца> = 4, а затем настройки разных столбцов. Я зашел так далеко, что настроил это, но получил ValueError, заявив, что серия слишком неоднозначна

 def PolYear(x):
  y = x.dt.month
  if y >= 4:
    x.dt.year
  else:
    x.dt.year - 1

df['Pol_Year'] = PolYear(df['date'])
 

Я не был уверен, что это правильный путь, поэтому я также попробовал формат df.loc для >= и < 4, но ключ len и значение не равны. Определенно думаю, что я упускаю что-то очень простое.

Ранее я упоминал «финансовый год», но это неверно.

Ответ №1:

У Куанг Хоанда была правильная идея , но он использовал неправильную частоту при вызове to_period(self, freq) . Для ваших целей вы хотите использовать следующий код:

 df.date.dt.to_period('Q-MAR').dt.qyear
 

Это даст вам:

 0    2021
1    2021
2    2019
Name: date, dtype: int64
 

Q-MAR определяет окончание финансового года в марте

Эти значения являются правильными финансовыми годами (в финансовых годах используется год, в котором они заканчиваются, а не где они начинаются [ссылка]). Если вы хотите получить выходные данные, используя год, в котором они начинаются, это просто:

 df.date.dt.to_period('Q-MAR').dt.qyear - 1
 

Предоставляя вам

 0    2020
1    2020
2    2018
Name: date, dtype: int64
 

документы за год

Ответ №2:

Это qyear :

 df.date.dt.to_period('Q').dt.qyear
 

Вывод:

 0    2020
1    2021
2    2019
Name: date, dtype: int64