Python – получить год политики из фрейма данных datetime

У меня есть фрейм данных (df) со столбцом в формате даты и времени ГГГГ-ММ-ДД («дата»). Я пытаюсь создать новый столбец, который возвращает год политики, который всегда начинается 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

Я не совсем уверен, как именно это настроить. Я пытался избежать настройки нескольких столбцов для логического значения в течение месяца> = 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 не равны. Определенно думаю, что мне не хватает чего-то очень простого.

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
151
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это qyear:

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

Выход:

0    2020
1    2021
2    2019
Name: date, dtype: int64
Ответ принят как подходящий

У Куанг Хоанда была правильная идея, но он использовал неправильную частоту в вызове 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

qyear документы

Другие вопросы по теме