У меня есть фрейм данных (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 не равны. Определенно думаю, что мне не хватает чего-то очень простого.
Ранее я упомянул «финансовый год», но это неверно.
Это 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