pandasには日付(タイムスタンプ)を範囲指定して生成するdate_rangeという便利なメソッドがある。

このメソッドは、単純に一定期間のタイムスタンプを生成するだけでなく、今年1年間の水曜日のみ、営業日のみ等のあらゆる頻度を任意で設定することもできる。

では早速、例を見ていこう。

基本的な日付範囲の生成

まずは基本的な使い方として、開始日と終了日を指定して日付範囲を生成する例を見ていく。

import pandas as pd

index = pd.date_range('2019/04/01', '2019/05/31')

index
# DatetimeIndex(['2019-04-01', '2019-04-02', '2019-04-03', '2019-04-04',
#                '2019-04-05', '2019-04-06', '2019-04-07', '2019-04-08',
#                '2019-04-09', '2019-04-10', '2019-04-11', '2019-04-12',
#                '2019-04-13', '2019-04-14', '2019-04-15', '2019-04-16',
#                '2019-04-17', '2019-04-18', '2019-04-19', '2019-04-20',
#                '2019-04-21', '2019-04-22', '2019-04-23', '2019-04-24',
#                '2019-04-25', '2019-04-26', '2019-04-27', '2019-04-28',
#                '2019-04-29', '2019-04-30', '2019-05-01', '2019-05-02',
#                '2019-05-03', '2019-05-04', '2019-05-05', '2019-05-06',
#                '2019-05-07', '2019-05-08', '2019-05-09', '2019-05-10',
#                '2019-05-11', '2019-05-12', '2019-05-13', '2019-05-14',
#                '2019-05-15', '2019-05-16', '2019-05-17', '2019-05-18',
#                '2019-05-19', '2019-05-20', '2019-05-21', '2019-05-22',
#                '2019-05-23', '2019-05-24', '2019-05-25', '2019-05-26',
#                '2019-05-27', '2019-05-28', '2019-05-29', '2019-05-30',
#                '2019-05-31'],
#               dtype='datetime64[ns]', freq='D')

なお、開始日または終了日のみを指定することもできるが、その場合は生成する日数を別途指定しなければならない。

pd.date_range(start='2019/04/01', periods=14)
# DatetimeIndex(['2019-04-01', '2019-04-02', '2019-04-03', '2019-04-04',
#                '2019-04-05', '2019-04-06', '2019-04-07', '2019-04-08',
#                '2019-04-09', '2019-04-10', '2019-04-11', '2019-04-12',
#                '2019-04-13', '2019-04-14'],
#               dtype='datetime64[ns]', freq='D')

pd.date_range(end='2019/05/31', periods=14)
# DatetimeIndex(['2019-05-18', '2019-05-19', '2019-05-20', '2019-05-21',
#                '2019-05-22', '2019-05-23', '2019-05-24', '2019-05-25',
#                '2019-05-26', '2019-05-27', '2019-05-28', '2019-05-29',
#                '2019-05-30', '2019-05-31'],
#               dtype='datetime64[ns]', freq='D')

時系列の頻度を指定し、日付範囲を生成する

「頻度」というと分かりづらいかもしれないが、開始日と終了日を指定した範囲の中から、指定した条件に基づいた日付範囲のみを生成することもできる。

まずは例として、曜日指定の例を見ていこう。
※以下は2019年10月の水曜日のみを生成した例だ。

pd.date_range('2019/10/01', '2019/10/31', freq='W-WED')
# DatetimeIndex(['2019-10-02', '2019-10-09', '2019-10-16', '2019-10-23',
#                '2019-10-30'],
#               dtype='datetime64[ns]', freq='W-WED')

また、毎営業日(月〜金)のみを生成するオプション(freq=’B’)等も用意されている。

pd.date_range('2019/10/01', '2019/10/31', freq='B')
# DatetimeIndex(['2019-10-01', '2019-10-02', '2019-10-03', '2019-10-04',
#                '2019-10-07', '2019-10-08', '2019-10-09', '2019-10-10',
#                '2019-10-11', '2019-10-14', '2019-10-15', '2019-10-16',
#                '2019-10-17', '2019-10-18', '2019-10-21', '2019-10-22',
#                '2019-10-23', '2019-10-24', '2019-10-25', '2019-10-28',
#                '2019-10-29', '2019-10-30', '2019-10-31'],
#               dtype='datetime64[ns]', freq='B')

他にもあらゆる頻度を指定するオプションが用意されているので、そのうち基本的な一部のみを表にしておく。

freq説明
B毎営業日(月〜金)
H毎時
T(またはmin)毎分
S毎秒
BM月の最終営業日ごと
BMS月の営業開始日ごと
W-MON, W-TUE, W-WED…指定した曜日ごと

整数と組み合わせて、より細かい頻度指定をおこなう

2時間ごと、5分ごとなど、より細かい頻度指定をおこなう場合、上記で紹介したオプション文字列の前に整数を指定すれば良い。

# 2時間ごと
pd.date_range('2019/10/01', '2019/10/2', freq='2H')
# DatetimeIndex(['2019-10-01 00:00:00', '2019-10-01 02:00:00',
#                '2019-10-01 04:00:00', '2019-10-01 06:00:00',
#                '2019-10-01 08:00:00', '2019-10-01 10:00:00',
#                '2019-10-01 12:00:00', '2019-10-01 14:00:00',
#                '2019-10-01 16:00:00', '2019-10-01 18:00:00',
#                '2019-10-01 20:00:00', '2019-10-01 22:00:00',
#                '2019-10-02 00:00:00'],
#               dtype='datetime64[ns]', freq='2H')

# 5分ごと
pd.date_range('2019/10/01', '2019/10/2', freq='5T')

# 1時間30分ごと
pd.date_range('2019/10/01', '2019/10/2', freq='1H30T')

# 3日ごと
pd.date_range('2019/10/01', '2019/10/31', freq='3D')