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