# Финансовый год – Определение финансового года в Pandas

Узнайте всё о фискальном году в Pandas!\
Библиотека Pandas делает получение информации о датах достаточно простым процессом — однако определение финансового года требует чуть больше усилий и не всегда интуитивно понятно. В этой статье я постараюсь объяснить этот процесс простым языком.

К концу этой статьи вы узнаете, как:

* Использовать метод `.to_period()` из Pandas для преобразования дат в разные временные периоды,
* Использовать метод `.qyear()` из Pandas для расчёта годов на основе разных стартовых месяцев,
* Форматировать фискальные годы в Pandas различными способами.

Кратко говоря, можно написать:

```python
df['Date'].dt.to_period('Q-MAR').dt.qyear.apply(lambda x: str(x-1) + "-" + str(x))
```

**Содержание**

* [Загрузка примера набора данных для работы с фискальным годом в Pandas](#zagruzka-primera-nabora-dannykh-dlya-raboty-s-fiskalnym-godom-v-pandas)
* [Использование `.to_period()` для преобразования дат в разные временные периоды](#pandas-.to_period-preobrazovanie-dat-v-raznye-vremennye-periody)
* [Использование `.qyear()` для расчёта годов на основе разных стартовых месяцев](#pandas-.qyear-raschyot-godov-na-osnove-raznykh-startovykh-mesyacev)
* [Форматирование фискального года в Pandas](#formatirovanie-fiskalnogo-goda-v-pandas)
* [Заключение](#zaklyuchenie)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

### Загрузка примера набора данных для работы с фискальным годом в Pandas

Начнём с загрузки набора данных, содержащего различные временные периоды. Мы импортируем библиотеку Pandas и выведем первые пять записей, чтобы понять, что представляет собой данные:

{% tabs %}
{% tab title="Код" %}

```python
import pandas as pd

dates = {'Date': ['1/1/2021', '1/31/2021', '2/1/2021', '2/28/2021', '3/1/2021', '3/31/2021', '4/1/2021', '4/30/2021', '5/1/2021', '5/31/2021', '6/1/2021']}

df = pd.DataFrame(dates)
df['Date'] = pd.to_datetime(df['Date'])

print(df)
```

{% endtab %}

{% tab title="Результат" %}

```python
         Date
0  2021-01-01
1  2021-01-31
2  2021-02-01
3  2021-02-28
4  2021-03-01
5  2021-03-31
6  2021-04-01
7  2021-04-30
8  2021-05-01
9  2021-05-31
10 2021-06-01
```

{% endtab %}
{% endtabs %}

По умолчанию, мы можем получить доступ к календарному году с помощью аксессора `.dt.year`. Давайте посмотрим, как это сделать — извлечём календарный год и поместим его в отдельный столбец. Создадим новый столбец с названием `Year` и присвоим ему значение года:

{% tabs %}
{% tab title="Код" %}

```python
df['Year'] = df['Date'].dt.year
print(df)
```

{% endtab %}

{% tab title="Результат" %}

```python
         Date  Year
0  2021-01-01  2021
1  2021-01-31  2021
2  2021-02-01  2021
3  2021-02-28  2021
4  2021-03-01  2021
5  2021-03-31  2021
6  2021-04-01  2021
7  2021-04-30  2021
8  2021-05-01  2021
9  2021-05-31  2021
10 2021-06-01  2021
```

{% endtab %}
{% endtabs %}

Ознакомьтесь с другими уроками Python на сайте datagy, включая наше полное руководство по оформлению таблиц в Pandas и подробный обзор сводных таблиц (Pivot Tables) в Pandas!

### Pandas `.to_period()` — преобразование дат в разные временные периоды

Библиотека Pandas позволяет легко преобразовывать данные типа дата и время в различные временные периоды. С помощью метода `.to_period()` можно переводить значения дат в кварталы, месяцы, годы и другие периоды. Давайте рассмотрим это на примере.

Преобразуем значения дат в кварталы, считая первым месяцем года апрель (это означает, что мы будем использовать строку `'Q-MAR'`, где `Q` обозначает квартал, а `MAR` указывает, что финансовый год заканчивается в марте):

{% tabs %}
{% tab title="Код" %}

```python
df['As Quarter'] = df['Date'].dt.to_period('Q-MAR')
print(df)
```

{% endtab %}

{% tab title="Результат" %}

```python
         Date  Year As Quarter
0  2021-01-01  2021     2021Q4
1  2021-01-31  2021     2021Q4
2  2021-02-01  2021     2021Q4
3  2021-02-28  2021     2021Q4
4  2021-03-01  2021     2021Q4
5  2021-03-31  2021     2021Q4
6  2021-04-01  2021     2022Q1
7  2021-04-30  2021     2022Q1
8  2021-05-01  2021     2022Q1
9  2021-05-31  2021     2022Q1
10 2021-06-01  2021     2022Q1
```

{% endtab %}
{% endtabs %}

Мы создали новый столбец (`"Quarter"`), который использует апрель в качестве первого месяца года и объединяет значения по кварталам, где период с апреля по июнь считается первым кварталом.

### Pandas `.qyear()` — расчёт годов на основе разных стартовых месяцев

Теперь, когда мы преобразовали данные с помощью метода `.to_period()`, давайте извлечём только год. Может возникнуть желание воспользоваться аксессором `.dt.year`, но в этом случае будет возвращаться календарный год. Вместо этого Pandas предоставляет удобный метод `.qyear()`, который возвращает год на основе заданного начального квартала. Если бы мы не выполняли преобразование данных с помощью `.to_period()`, результаты методов `.year` и `.qyear()` совпадали бы.

{% hint style="info" %}
**Примечание!** Pandas возвращает год окончания финансового периода.
{% endhint %}

Рассмотрим это на примере:

{% tabs %}
{% tab title="Код" %}

```python
df['Fiscal Year'] = df['As Quarter'].dt.qyear
print(df)
```

{% endtab %}

{% tab title="Результат" %}

```python
         Date  Year As Quarter  Fiscal Year
0  2021-01-01  2021     2021Q4         2021
1  2021-01-31  2021     2021Q4         2021
2  2021-02-01  2021     2021Q4         2021
3  2021-02-28  2021     2021Q4         2021
4  2021-03-01  2021     2021Q4         2021
5  2021-03-31  2021     2021Q4         2021
6  2021-04-01  2021     2022Q1         2022
7  2021-04-30  2021     2022Q1         2022
8  2021-05-01  2021     2022Q1         2022
9  2021-05-31  2021     2022Q1         2022
10 2021-06-01  2021     2022Q1         2022
```

{% endtab %}
{% endtabs %}

Обратите внимание, что мы можем записать всё это в одну строку, объединив методы:

```python
df['Fiscal Year'] = df['Date'].dt.to_period('Q-MAR').dt.qyear
```

### Форматирование фискального года в Pandas

По умолчанию Pandas извлекает только первый год фискального года. Если ваш фискальный год не совпадает с календарным (январь–декабрь), он всегда будет охватывать два календарных года. Для лучшей идентификации может быть полезно включить оба года в названии. Давайте создадим новый столбец, в котором годы будут отображаться в формате: 2021-2022:

{% tabs %}
{% tab title="Код" %}

```python
df['Fiscal Year Range'] = df['Date'].dt.to_period('Q-APR').dt.qyear.apply(lambda x: str(x-1) + "-" + str(x))
print(df)
```

{% endtab %}

{% tab title="Результат" %}

```python
         Date  Year As Quarter  Fiscal Year Fiscal Year Range
0  2021-01-01  2021     2021Q4         2021         2020-2021
1  2021-01-31  2021     2021Q4         2021         2020-2021
2  2021-02-01  2021     2021Q4         2021         2020-2021
3  2021-02-28  2021     2021Q4         2021         2020-2021
4  2021-03-01  2021     2021Q4         2021         2020-2021
5  2021-03-31  2021     2021Q4         2021         2020-2021
6  2021-04-01  2021     2022Q1         2022         2021-2022
7  2021-04-30  2021     2022Q1         2022         2021-2022
8  2021-05-01  2021     2022Q1         2022         2021-2022
9  2021-05-31  2021     2022Q1         2022         2021-2022
10 2021-06-01  2021     2022Q1         2022         2021-2022
```

{% endtab %}
{% endtabs %}

### Заключение

В этой статье вы узнали, как рассчитывать пользовательские фискальные годы в Pandas с помощью преобразования временных рядов методом `.to_period()` и извлечения года с помощью метода `.qyear()`. Также вы научились форматировать годы в различные виды для удобства отображения.

Для получения дополнительной информации ознакомьтесь с официальной документацией по методам [.to\_period()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.to_period.html) и [.qyear()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.qyear.html).

### Дополнительные ресурсы

Чтобы узнать больше по смежным темам, ознакомьтесь со следующими материалами:

* [Pandas to\_datetime: Преобразование строкового столбца в дату и время](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html)
* [Работа с датами и временем в Pandas и Python](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html)
* [Извлечение частей даты (месяц, год и т.д.) в Pandas](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.year.html)
* [Как добавить дни к дате в столбце Pandas](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.days.html)
