【pandas】日付から年度を取得する方法

pandasで年度を取得する方法です。4月始まりの年度(4〜3月)単位でグループ化しやすいよう、日付をもとに年度カラムを追加します。

使用するCSVファイル

元データとして下記のような日付8桁を含むCSVを使用します。


date,id,note
20210131,123,test1
20210228,234,test2
20210331,345,test3
20210430,456,test4
20210531,567,test5
20210630,678,test6
20210731,789,test7
20210831,890,test8
20210930,901,test9
20211031,1012,test10
20211130,1123,test11
20211231,1234,test12
20220131,1345,test13
20220228,1456,test14
20220331,1567,test15
20220430,1678,test16
20220531,1789,test17

ここから日付に応じた年度列を追加したDataFrameを作成します。

コード


import pandas as pd

# CSVファイル(data.csv)をpandas.DaraFrameとして読み込み
df = pd.read_csv('data.csv')

# dateカラム(int型 YYYYMMDD)を日付型に変換
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')

# year(年度)カラムを追加
df.loc[df['date'].dt.month >= 4, 'year'] = df['date'].dt.year
df.loc[df['date'].dt.month < 4, 'year'] = df['date'].dt.year - 1

# yearカラムをfloat型からint型に変換
df['year'] = df['year'].astype(int)

年度追加後(DaraFrame)


print(df)

         date    id    note  year
0  2021-01-31   123   test1  2020
1  2021-02-28   234   test2  2020
2  2021-03-31   345   test3  2020
3  2021-04-30   456   test4  2021
4  2021-05-31   567   test5  2021
5  2021-06-30   678   test6  2021
6  2021-07-31   789   test7  2021
7  2021-08-31   890   test8  2021
8  2021-09-30   901   test9  2021
9  2021-10-31  1012  test10  2021
10 2021-11-30  1123  test11  2021
11 2021-12-31  1234  test12  2021
12 2022-01-31  1345  test13  2021
13 2022-02-28  1456  test14  2021
14 2022-03-31  1567  test15  2021
15 2022-04-30  1678  test16  2022
16 2022-05-31  1789  test17  2022

補足

ここでは同一ディレクトリにある'data.csv'を読み込む想定としています。
dataカラムは8桁数値のためCSVを読み込んだ時点ではint型になっています。


import pandas as pd

df = pd.read_csv('data.csv')

print(df.dtypes)
print("--------------------------")
print(df)

date     int64
id       int64
note    object
dtype: object
--------------------------
        date    id    note
0   20210131   123   test1
1   20210228   234   test2
2   20210331   345   test3
3   20210430   456   test4
4   20210531   567   test5
5   20210630   678   test6
6   20210731   789   test7
7   20210831   890   test8
8   20210930   901   test9
9   20211031  1012  test10
10  20211130  1123  test11
11  20211231  1234  test12
12  20220131  1345  test13
13  20220228  1456  test14
14  20220331  1567  test15
15  20220430  1678  test16
16  20220531  1789  test17

[参考]
CSV読み込み pandas.read_csv — pandas 1.2.2 documentation
データ型の確認 pandas.DataFrame.dtypes — pandas 1.2.2 documentation

int型から日付型への変換

数値型になっている'date'カラムを日付型に変換します。


df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')

print(df.dtypes)

date    datetime64[ns]
id               int64
note            object
dtype: object

[参考]
日付型への変換(YYYYMMDD → YYYY-MM-DD) pandas.to_datetime — pandas 1.2.2 documentation
日付フォーマット指定(%Y%m%d など) datetime — Basic date and time types — Python 3.9.2 documentation

年度カラム追加

日付('date'カラム)から算出した年度を年度列('year'カラム)として追加します。
ここでは、locで抽出した「'date'カラムが4〜12月('month'が4以上)のデータ」の'year'カラム(新規)をyear(YYYY)の値で更新し、
同様に「'date'カラムが1〜3月('month'が4未満)のデータ」の'year'カラム(新規)をyear-1(YYYY-1)の値で更新しています。


df.loc[df['date'].dt.month >= 4, 'year'] = df['date'].dt.year
df.loc[df['date'].dt.month < 4, 'year'] = df['date'].dt.year - 1

print(df.dtypes)
print("--------------------------")
print(df)

date    datetime64[ns]
id               int64
note            object
year           float64
dtype: object
--------------------------
         date    id    note    year
0  2021-01-31   123   test1  2020.0
1  2021-02-28   234   test2  2020.0
2  2021-03-31   345   test3  2020.0
3  2021-04-30   456   test4  2021.0
4  2021-05-31   567   test5  2021.0
5  2021-06-30   678   test6  2021.0
6  2021-07-31   789   test7  2021.0
7  2021-08-31   890   test8  2021.0
8  2021-09-30   901   test9  2021.0
9  2021-10-31  1012  test10  2021.0
10 2021-11-30  1123  test11  2021.0
11 2021-12-31  1234  test12  2021.0
12 2022-01-31  1345  test13  2021.0
13 2022-02-28  1456  test14  2021.0
14 2022-03-31  1567  test15  2021.0
15 2022-04-30  1678  test16  2022.0
16 2022-05-31  1789  test17  2022.0

[参考]
位置の取得 pandas.DataFrame.loc — pandas 1.2.2 documentation
datetime型から年を取得 pandas.Series.dt.year — pandas 1.2.2 documentation
datetime型から月を取得 pandas.Series.dt.month — pandas 1.2.2 documentation

型の変換

上で追加した'year'カラムの型がfloat型になっているため、int型に変換します。


df['year'] = df['year'].astype(int)

print(df.dtypes)

date    datetime64[ns]
id               int64
note            object
year             int64
dtype: object

[参考]
型の変換 pandas.Series.astype — pandas 1.2.2 documentation

完成


print(df)

         date    id    note  year
0  2021-01-31   123   test1  2020
1  2021-02-28   234   test2  2020
2  2021-03-31   345   test3  2020
3  2021-04-30   456   test4  2021
4  2021-05-31   567   test5  2021
5  2021-06-30   678   test6  2021
6  2021-07-31   789   test7  2021
7  2021-08-31   890   test8  2021
8  2021-09-30   901   test9  2021
9  2021-10-31  1012  test10  2021
10 2021-11-30  1123  test11  2021
11 2021-12-31  1234  test12  2021
12 2022-01-31  1345  test13  2021
13 2022-02-28  1456  test14  2021
14 2022-03-31  1567  test15  2021
15 2022-04-30  1678  test16  2022
16 2022-05-31  1789  test17  2022
タグ:

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください