pandasの時系列データにおける頻度(引数freq)の指定方法
pandasの時系列データに対するメソッドの引数で頻度(freq
)を指定することが度々ある。頻度を表す文字列(頻度コード)と数値で任意の頻度や期間を指定できる。
例えば元データをリサンプリングするresample()
やasfreq()
メソッドなどで使う。
ここでは例としてpd.date_range()
を使って、頻度(freq
)の指定方法について説明する。
以下の内容について説明する。
- 頻度コード一覧
- 日付関連
- 時刻関連
- 数値で間隔を指定
- 複数の頻度コードの組み合わせ
pandas.DataFrame
やpandas.Series
のインデックスをdatetime64
型のDatetimeIndex
として設定し時系列データとして扱う方法などについては以下の記事を参照。
頻度コード一覧
基本となる頻度コードを示す。数値を使って間隔を指定したり、複数のコードを指定する例は後述。
公式ドキュメントは以下。
- Time Series / Date functionality: Offset Aliases — pandas 0.23.3 documentation
- Time Series / Date functionality: Anchored Offsets — pandas 0.23.3 documentation
日付関連
日付関連の頻度コードは以下の通り。
D
: 毎日B
: 毎営業日(月曜 - 金曜)W
: 毎週(日曜始まり)M
: 月末ごとSM
: 15日と月末ごとQ
: 四半期末ごとA
またはY
: 年末ごと
M
, Q
, A
またはY
については期間の末日が対象となるが、先頭にB
を付けると営業日(月曜 - 金曜)、末尾にS
をつけると末日ではなく開始日となる。
例えば、
BM
: 月末最終営業日ごとMS
: 毎月の開始日ごとBMS
: 毎月の最初の営業日ごと
となる。Q
, A
またはY
でも同様。
M
とMS
, BMS
の例。
import pandas as pd
print(pd.date_range('2018-01-01', '2018-12-31', freq='M'))
# DatetimeIndex(['2018-01-31', '2018-02-28', '2018-03-31', '2018-04-30',
# '2018-05-31', '2018-06-30', '2018-07-31', '2018-08-31',
# '2018-09-30', '2018-10-31', '2018-11-30', '2018-12-31'],
# dtype='datetime64[ns]', freq='M')
print(pd.date_range('2018-01-01', '2018-12-31', freq='MS'))
# DatetimeIndex(['2018-01-01', '2018-02-01', '2018-03-01', '2018-04-01',
# '2018-05-01', '2018-06-01', '2018-07-01', '2018-08-01',
# '2018-09-01', '2018-10-01', '2018-11-01', '2018-12-01'],
# dtype='datetime64[ns]', freq='MS')
print(pd.date_range('2018-01-01', '2018-12-31', freq='BMS'))
# DatetimeIndex(['2018-01-01', '2018-02-01', '2018-03-01', '2018-04-02',
# '2018-05-01', '2018-06-01', '2018-07-02', '2018-08-01',
# '2018-09-03', '2018-10-01', '2018-11-01', '2018-12-03'],
# dtype='datetime64[ns]', freq='BMS')
SM
(15日と月末ごと)についてはSMS
(月初と15日ごと)が指定可能。営業日は指定できない。
print(pd.date_range('2018-01-01', '2018-12-31', freq='SM'))
# DatetimeIndex(['2018-01-15', '2018-01-31', '2018-02-15', '2018-02-28',
# '2018-03-15', '2018-03-31', '2018-04-15', '2018-04-30',
# '2018-05-15', '2018-05-31', '2018-06-15', '2018-06-30',
# '2018-07-15', '2018-07-31', '2018-08-15', '2018-08-31',
# '2018-09-15', '2018-09-30', '2018-10-15', '2018-10-31',
# '2018-11-15', '2018-11-30', '2018-12-15', '2018-12-31'],
# dtype='datetime64[ns]', freq='SM-15')
print(pd.date_range('2018-01-01', '2018-12-31', freq='SMS'))
# DatetimeIndex(['2018-01-01', '2018-01-15', '2018-02-01', '2018-02-15',
# '2018-03-01', '2018-03-15', '2018-04-01', '2018-04-15',
# '2018-05-01', '2018-05-15', '2018-06-01', '2018-06-15',
# '2018-07-01', '2018-07-15', '2018-08-01', '2018-08-15',
# '2018-09-01', '2018-09-15', '2018-10-01', '2018-10-15',
# '2018-11-01', '2018-11-15', '2018-12-01', '2018-12-15'],
# dtype='datetime64[ns]', freq='SMS-15')
W
(週次)は毎日曜日が対象となるが、W-MON
のように任意の曜日を指定可能。
W-SUN
(W
と同じ),W-MON
,W-TUE
,W-WED
,W-THU
,W-FRI
,W-SAT
print(pd.date_range('2018-01-01', '2018-12-31', freq='W'))
# DatetimeIndex(['2018-01-07', '2018-01-14', '2018-01-21', '2018-01-28',
# '2018-02-04', '2018-02-11', '2018-02-18', '2018-02-25',
# '2018-03-04', '2018-03-11', '2018-03-18', '2018-03-25',
# '2018-04-01', '2018-04-08', '2018-04-15', '2018-04-22',
# '2018-04-29', '2018-05-06', '2018-05-13', '2018-05-20',
# '2018-05-27', '2018-06-03', '2018-06-10', '2018-06-17',
# '2018-06-24', '2018-07-01', '2018-07-08', '2018-07-15',
# '2018-07-22', '2018-07-29', '2018-08-05', '2018-08-12',
# '2018-08-19', '2018-08-26', '2018-09-02', '2018-09-09',
# '2018-09-16', '2018-09-23', '2018-09-30', '2018-10-07',
# '2018-10-14', '2018-10-21', '2018-10-28', '2018-11-04',
# '2018-11-11', '2018-11-18', '2018-11-25', '2018-12-02',
# '2018-12-09', '2018-12-16', '2018-12-23', '2018-12-30'],
# dtype='datetime64[ns]', freq='W-SUN')
print(pd.date_range('2018-01-01', '2018-12-31', freq='W-WED'))
# DatetimeIndex(['2018-01-03', '2018-01-10', '2018-01-17', '2018-01-24',
# '2018-01-31', '2018-02-07', '2018-02-14', '2018-02-21',
# '2018-02-28', '2018-03-07', '2018-03-14', '2018-03-21',
# '2018-03-28', '2018-04-04', '2018-04-11', '2018-04-18',
# '2018-04-25', '2018-05-02', '2018-05-09', '2018-05-16',
# '2018-05-23', '2018-05-30', '2018-06-06', '2018-06-13',
# '2018-06-20', '2018-06-27', '2018-07-04', '2018-07-11',
# '2018-07-18', '2018-07-25', '2018-08-01', '2018-08-08',
# '2018-08-15', '2018-08-22', '2018-08-29', '2018-09-05',
# '2018-09-12', '2018-09-19', '2018-09-26', '2018-10-03',
# '2018-10-10', '2018-10-17', '2018-10-24', '2018-10-31',
# '2018-11-07', '2018-11-14', '2018-11-21', '2018-11-28',
# '2018-12-05', '2018-12-12', '2018-12-19', '2018-12-26'],
# dtype='datetime64[ns]', freq='W-WED')
同様に、四半期Q
、年次A
またはY
では終了月あるいは開始月をQ-FEB
のように指定できる。月の略称は以下の通り。
JAN
,FEB
,MAR
,APR
,MAY
,JUN
,JUL
,AUG
,SEP
,OCT
,NOV
,DEC
print(pd.date_range('2018-01-01', '2018-12-31', freq='QS'))
# DatetimeIndex(['2018-01-01', '2018-04-01', '2018-07-01', '2018-10-01'], dtype='datetime64[ns]', freq='QS-JAN')
print(pd.date_range('2018-01-01', '2018-12-31', freq='QS-FEB'))
# DatetimeIndex(['2018-02-01', '2018-05-01', '2018-08-01', '2018-11-01'], dtype='datetime64[ns]', freq='QS-FEB')
print(pd.date_range('2015-01-01', '2018-12-31', freq='A'))
# DatetimeIndex(['2015-12-31', '2016-12-31', '2017-12-31', '2018-12-31'], dtype='datetime64[ns]', freq='A-DEC')
print(pd.date_range('2015-01-01', '2018-12-31', freq='A-JUL'))
# DatetimeIndex(['2015-07-31', '2016-07-31', '2017-07-31', '2018-07-31'], dtype='datetime64[ns]', freq='A-JUL')
そのほか、毎月の第何週目の曜日を指定できる。WOM-4FRI
のようにWOM-<第何週かの数値><曜日>
で指定する。
print(pd.date_range('2018-01-01', '2018-12-31', freq='WOM-4FRI'))
# DatetimeIndex(['2018-01-26', '2018-02-23', '2018-03-23', '2018-04-27',
# '2018-05-25', '2018-06-22', '2018-07-27', '2018-08-24',
# '2018-09-28', '2018-10-26', '2018-11-23', '2018-12-28'],
# dtype='datetime64[ns]', freq='WOM-4FRI')
print(pd.date_range('2018-01-01', '2018-12-31', freq='WOM-2MON'))
# DatetimeIndex(['2018-01-08', '2018-02-12', '2018-03-12', '2018-04-09',
# '2018-05-14', '2018-06-11', '2018-07-09', '2018-08-13',
# '2018-09-10', '2018-10-08', '2018-11-12', '2018-12-10'],
# dtype='datetime64[ns]', freq='WOM-2MON')
時刻関連
時刻関連の頻度コードは以下の通り。
H
: 毎時T
またはmin
: 毎分S
: 毎秒L
またはms
: 毎ミリ秒U
またはus
: 毎マイクロ秒N
: 毎ナノ秒
H
の例。
print(pd.date_range('2018-01-01', '2018-01-02', freq='H'))
# DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00',
# '2018-01-01 02:00:00', '2018-01-01 03:00:00',
# '2018-01-01 04:00:00', '2018-01-01 05:00:00',
# '2018-01-01 06:00:00', '2018-01-01 07:00:00',
# '2018-01-01 08:00:00', '2018-01-01 09:00:00',
# '2018-01-01 10:00:00', '2018-01-01 11:00:00',
# '2018-01-01 12:00:00', '2018-01-01 13:00:00',
# '2018-01-01 14:00:00', '2018-01-01 15:00:00',
# '2018-01-01 16:00:00', '2018-01-01 17:00:00',
# '2018-01-01 18:00:00', '2018-01-01 19:00:00',
# '2018-01-01 20:00:00', '2018-01-01 21:00:00',
# '2018-01-01 22:00:00', '2018-01-01 23:00:00',
# '2018-01-02 00:00:00'],
# dtype='datetime64[ns]', freq='H')
数値で間隔を指定
頻度コードの先頭に整数値を付けることで間隔を指定できる。
例えば、100D
は100日ごと、100B
は100営業日ごと、10W
は10週ごとの日曜日、10W-WED
は10週ごとの水曜日、2M
は隔月、90T
は90分ごととなる。
print(pd.date_range('2018-01-01', '2018-12-31', freq='100D'))
# DatetimeIndex(['2018-01-01', '2018-04-11', '2018-07-20', '2018-10-28'], dtype='datetime64[ns]', freq='100D')
print(pd.date_range('2018-01-01', '2018-12-31', freq='100B'))
# DatetimeIndex(['2018-01-01', '2018-05-21', '2018-10-08'], dtype='datetime64[ns]', freq='100B')
print(pd.date_range('2018-01-01', '2018-12-31', freq='10W'))
# DatetimeIndex(['2018-01-07', '2018-03-18', '2018-05-27', '2018-08-05',
# '2018-10-14', '2018-12-23'],
# dtype='datetime64[ns]', freq='10W-SUN')
print(pd.date_range('2018-01-01', '2018-12-31', freq='10W-WED'))
# DatetimeIndex(['2018-01-03', '2018-03-14', '2018-05-23', '2018-08-01',
# '2018-10-10', '2018-12-19'],
# dtype='datetime64[ns]', freq='10W-WED')
print(pd.date_range('2018-01-01', '2018-12-31', freq='2M'))
# DatetimeIndex(['2018-01-31', '2018-03-31', '2018-05-31', '2018-07-31',
# '2018-09-30', '2018-11-30'],
# dtype='datetime64[ns]', freq='2M')
print(pd.date_range('2018-01-01', '2018-01-02', freq='90T'))
# DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:30:00',
# '2018-01-01 03:00:00', '2018-01-01 04:30:00',
# '2018-01-01 06:00:00', '2018-01-01 07:30:00',
# '2018-01-01 09:00:00', '2018-01-01 10:30:00',
# '2018-01-01 12:00:00', '2018-01-01 13:30:00',
# '2018-01-01 15:00:00', '2018-01-01 16:30:00',
# '2018-01-01 18:00:00', '2018-01-01 19:30:00',
# '2018-01-01 21:00:00', '2018-01-01 22:30:00',
# '2018-01-02 00:00:00'],
# dtype='datetime64[ns]', freq='90T')
複数の頻度コードの組み合わせ
D
, H
, T
(min
), S
, L
(ms
), U
(us
), N
は組み合わせて指定可能。
例えば36時間ごとは36H
でも1D12H
でもOK。あまり使うことはないかもしれないが、ミリ秒やマイクロ秒まで細かく組み合わせることも可能。
print(pd.date_range('2018-01-01', '2018-01-10', freq='36H'))
# DatetimeIndex(['2018-01-01 00:00:00', '2018-01-02 12:00:00',
# '2018-01-04 00:00:00', '2018-01-05 12:00:00',
# '2018-01-07 00:00:00', '2018-01-08 12:00:00',
# '2018-01-10 00:00:00'],
# dtype='datetime64[ns]', freq='36H')
print(pd.date_range('2018-01-01', '2018-01-10', freq='1D12H'))
# DatetimeIndex(['2018-01-01 00:00:00', '2018-01-02 12:00:00',
# '2018-01-04 00:00:00', '2018-01-05 12:00:00',
# '2018-01-07 00:00:00', '2018-01-08 12:00:00',
# '2018-01-10 00:00:00'],
# dtype='datetime64[ns]', freq='36H')
print(pd.date_range('2018-01-01', '2018-01-2', freq='30min30S100ms100us'))
# DatetimeIndex([ '2018-01-01 00:00:00', '2018-01-01 00:30:30.100100',
# '2018-01-01 01:01:00.200200', '2018-01-01 01:31:30.300300',
# '2018-01-01 02:02:00.400400', '2018-01-01 02:32:30.500500',
# '2018-01-01 03:03:00.600600', '2018-01-01 03:33:30.700700',
# '2018-01-01 04:04:00.800800', '2018-01-01 04:34:30.900900',
# '2018-01-01 05:05:01.001000', '2018-01-01 05:35:31.101100',
# '2018-01-01 06:06:01.201200', '2018-01-01 06:36:31.301300',
# '2018-01-01 07:07:01.401400', '2018-01-01 07:37:31.501500',
# '2018-01-01 08:08:01.601600', '2018-01-01 08:38:31.701700',
# '2018-01-01 09:09:01.801800', '2018-01-01 09:39:31.901900',
# '2018-01-01 10:10:02.002000', '2018-01-01 10:40:32.102100',
# '2018-01-01 11:11:02.202200', '2018-01-01 11:41:32.302300',
# '2018-01-01 12:12:02.402400', '2018-01-01 12:42:32.502500',
# '2018-01-01 13:13:02.602600', '2018-01-01 13:43:32.702700',
# '2018-01-01 14:14:02.802800', '2018-01-01 14:44:32.902900',
# '2018-01-01 15:15:03.003000', '2018-01-01 15:45:33.103100',
# '2018-01-01 16:16:03.203200', '2018-01-01 16:46:33.303300',
# '2018-01-01 17:17:03.403400', '2018-01-01 17:47:33.503500',
# '2018-01-01 18:18:03.603600', '2018-01-01 18:48:33.703700',
# '2018-01-01 19:19:03.803800', '2018-01-01 19:49:33.903900',
# '2018-01-01 20:20:04.004000', '2018-01-01 20:50:34.104100',
# '2018-01-01 21:21:04.204200', '2018-01-01 21:51:34.304300',
# '2018-01-01 22:22:04.404400', '2018-01-01 22:52:34.504500',
# '2018-01-01 23:23:04.604600', '2018-01-01 23:53:34.704700'],
# dtype='datetime64[ns]', freq='1830100100U')