Python

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

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

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

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

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

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

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

import pandas as pd

date_index = pd.date_range(start="2020-01-01", end="2020-12-15", freq="M")
print(date_index )
>>
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
               '2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
               '2020-09-30', '2020-10-31', '2020-11-30'],
              dtype='datetime64[ns]', freq='M')

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

periodsを指定するパターン

startとperiods

import pandas as pd

date_index = pd.date_range(start="2020/1/1", periods=15, freq="M")
print(date_idnex)
>>
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
               '2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
               '2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31',
               '2021-01-31', '2021-02-28', '2021-03-31'],
              dtype='datetime64[ns]', freq='M')

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

endとperiods

import pandas as pd

date_index = pd.date_range(end="2020-01-01", periods=15, freq="M")
print(date_index)
>>
DatetimeIndex(['2018-10-31', '2018-11-30', '2018-12-31', '2019-01-31',
               '2019-02-28', '2019-03-31', '2019-04-30', '2019-05-31',
               '2019-06-30', '2019-07-31', '2019-08-31', '2019-09-30',
               '2019-10-31', '2019-11-30', '2019-12-31'],
              dtype='datetime64[ns]', freq='M')

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

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

import pandas as pd

pd.date_range(start="2020-01-01", end="2020-12-15", periods=15, freq="M")
>>
ValueError: Of the four parameters: start, end, periods, and freq, exactly three must be specified

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

 

色々な頻度

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

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

月初

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

 

月末

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

 

半月(15日と月初)

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

 

半月(15日と月末)

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

 

3日

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

 

色々な単位を指定可能。