【Pandas】DataFrameやSeriesで1か月後の日付を計算する
MAX
MAX999blog
時系列関連のデータを扱う際に、日次、週次、月次データなどで、日付が歯抜けになっている場合、正確に分析できなくなってしまう場合がある。
特に日次データと言いつつ、営業日しかデータがなく、週末に該当する日付が飛んでいることはよくある。
日付に抜けがあるかどうかは、データ量が多くなってくるとぱっと見で分からなくなってくるので、インデックス用の日付を作成して結合するのが確実。
インデックスの作成にはpandasのdate_rangeを使用すると便利。
作成する期間や単位を指定できる。
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を作成してくれる。
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の数だけ値を作成してくれる。
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の数だけ値を作成してくれる。
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')
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')
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')
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')
色々な単位を指定可能。