pandas

【Pandas】インデックス用の日付を作成する

MAX

時系列関連のデータを扱う際に、日次、週次、月次データなどで、日付が歯抜けになっている場合、正確に分析できなくなってしまう場合がある。

特に日次データと言いつつ、営業日しかデータがなく、週末に該当する日付が飛んでいることはよくある。

日付に抜けがあるかどうかは、データ量が多くなってくるとぱっと見で分からなくなってくるので、インデックス用の日付を作成して結合するのが確実。

インデックスの作成にはpandasのdate_rangeを使用すると便利。

作成する期間や単位を指定できる。

スポンサーリンク

startとendを指定するパターン

1import pandas as pd
2
3date_index = pd.date_range(start="2020-01-01", end="2020-12-15", freq="M")
4print(date_index )
5
6# DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
7#                '2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
8#                '2020-09-30', '2020-10-31', '2020-11-30'],
9#                dtype='datetime64[ns]', freq='M')

startとendの期間でfreqの頻度でDatetimeIndexを作成してくれる。

periodsを指定するパターン

startとperiods

1import pandas as pd
2
3date_index = pd.date_range(start="2020/1/1", periods=15, freq="M")
4print(date_idnex)
5
6# DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
7#                '2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
8#                '2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31',
9#                '2021-01-31', '2021-02-28', '2021-03-31'],
10#                dtype='datetime64[ns]', freq='M')

periodsとstartを指定すると、startからperiodsの数だけ値を作成してくれる。

endとperiods

1import pandas as pd
2
3date_index = pd.date_range(end="2020-01-01", periods=15, freq="M")
4print(date_index)
5
6# DatetimeIndex(['2018-10-31', '2018-11-30', '2018-12-31', '2019-01-31',
7#                '2019-02-28', '2019-03-31', '2019-04-30', '2019-05-31',
8#                '2019-06-30', '2019-07-31', '2019-08-31', '2019-09-30',
9#                '2019-10-31', '2019-11-30', '2019-12-31'],
10#                dtype='datetime64[ns]', freq='M')

periodsとendを指定するとendまでperiodsの数だけ値を作成してくれる。

startとendとperiodsを指定するとエラー

1import pandas as pd
2
3pd.date_range(start="2020-01-01", end="2020-12-15", periods=15, freq="M")
4
5# ValueError: Of the four parameters: start, end, periods, and freq, exactly three must be specified

periodsを指定した時にstartとendの両方が指定していると、ValueErrorとなる。

色々な頻度

freqに色々な値を指定することでかなり柔軟に日付を作成することが可能。

詳細はtimeseries-offset-aliasesを参照。

月初

1pd.date_range(start="2020-01-01", periods=5, freq="MS")
2
3# DatetimeIndex(['2020-01-01', '2020-02-01', '2020-03-01', '2020-04-01', '2020-05-01'],
4#               dtype='datetime64[ns]', freq='MS')

月末

1pd.date_range(start="2020-01-01", periods=5, freq="M")
2
3# DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
4#                '2020-05-31'],
5#                dtype='datetime64[ns]', freq='M')

半月(15日と月初)

1pd.date_range(start="2020-01-01", periods=5, freq="SMS")
2
3# DatetimeIndex(['2020-01-01', '2020-01-15', '2020-02-01', '2020-02-15', '2020-03-01'],
4#               dtype='datetime64[ns]', freq='SMS-15')

半月(15日と月末)

1pd.date_range(start="2020-01-01", periods=5, freq="SM")
2
3# DatetimeIndex(['2020-01-15', '2020-01-31', '2020-02-15', '2020-02-29',
4#                '2020-03-15'],
5#                dtype='datetime64[ns]', freq='SM-15')

3日

1pd.date_range(start="2020-01-01", periods=5, freq="3D")
2
3# DatetimeIndex(['2020-01-01', '2020-01-04', '2020-01-07', '2020-01-10',
4#                '2020-01-13'],
5#                dtype='datetime64[ns]', freq='3D')

色々な単位を指定可能。

スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました