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
Tweet