【Python】pd.period_range()を使ってyyyy-MM.parquetのファイルを順番に読み込む

下記のようなディレクトリ構成になっているときに、いい感じにファイル名のyyyy-MMを順番に取得して、処理をしたいときはpd.period_range()が便利です。

GA_log
├── 2017-01.parquet
├── 2017-02.parquet
├── 2017-03.parquet
├── 2017-04.parquet
├── 2017-05.parquet
├── 2017-06.parquet
├── 2017-07.parquet
├── 2017-08.parquet
├── 2017-09.parquet
├── 2017-10.parquet
├── 2017-11.parquet
├── 2017-12.parquet
└── 2018-01.parquet

pd.period_range()とは

pd.period_range()は、pandasの関数の1つで、固定頻度のPeriodIndexを返すために使用されます。この関数は、日(カレンダー)をデフォルトの頻度として使用します。期間の開始と終了を指定することができ、期間の長さを指定することもできます。freq引数で'M'を指定することでyyyy-MMを取得することができます。

pd.period_range()の基本的な使いかた

pd.period_range(start, end, periods=None, freq=None, name=None)
  • start:Periodまたは文字列で表される開始日付
  • end:Periodまたは文字列で表される終了日付
  • periods:PeriodIndexオブジェクトに含まれる期間の数。省略すると、startと- endの日付の差が使用されます
  • freq:PeriodIndexオブジェクトの頻度。有効な頻度の例としては、'D'(日)、'M'(月)、'Y'(年)などがあります
  • name:PeriodIndexオブジェクトの名前

pd.period_range()を使ってyyyy-MMを取得する

freq引数で'M'を指定することでyyyy-MMを取得することができます。

pd.period_range(start='2017-01-01', end='2018-01-01', freq='M')

出力結果

PeriodIndex(['2017-01', '2017-02', '2017-03', '2017-04', '2017-05', '2017-06',
             '2017-07', '2017-08', '2017-09', '2017-10', '2017-11', '2017-12',
             '2018-01'],
            dtype='period[M]')

こんな感じでyyyy-MM形式で取得できます。日付を扱う他のメソッドなどと比較して何がうれしいかというと、日付の日(day)の情報がないことです。pd.date_range()でも似たようなことができますが、yyyy-MM-ddのように日(day)の情報を持っていたり、時間の情報を持っていることもあり、それらを除く処理が必要になります。pd.period_range()を使えばその除く処理が不要になります。なのでコードが短くなってわかりやすくなり、メンテナンスやデバックなどがしやすくなって嬉しいと考えます。

ファイルを順番に読み込む

index_year_month=pd.period_range(start='2017-01-01', end='2018-01-01', freq='M', name='test')

for d in index_year_month:
    df=pd.read_parquet(f'./GA_log/{str(d)}.parquet')
    '''
    以下、何かしらの処理
    '''

これにより、GA_logディレクトリ内のparquetファイルが順番に読み込まれます。