pandasの時系列データにおける頻度(引数freq)の指定方法 | note.nkmk.me

pandasの時系列データにおける頻度(引数freq)の指定方法

Posted: | Tags: Python, pandas, 時系列データ

pandasの時系列データに対するメソッドの引数で頻度(freq)を指定することが度々ある。頻度を表す文字列(頻度コード)と数値で任意の頻度や期間を指定できる。

例えば元データをリサンプリングするresample()asfreq()メソッドなどで使う。

ここでは例としてpd.date_range()を使って、頻度(freq)の指定方法について説明する。

以下の内容について説明する。

  • 頻度コード一覧
    • 日付関連
    • 時刻関連
  • 数値で間隔を指定
  • 複数の頻度コードの組み合わせ

pandas.DataFramepandas.Seriesのインデックスをdatetime64型のDatetimeIndexとして設定し時系列データとして扱う方法などについては以下の記事を参照。

頻度コード一覧

基本となる頻度コードを示す。数値を使って間隔を指定したり、複数のコードを指定する例は後述。

公式ドキュメントは以下。

日付関連

日付関連の頻度コードは以下の通り。

  • D: 毎日
  • B: 毎営業日(月曜 - 金曜)
  • W: 毎週(日曜始まり)
  • M: 月末ごと
  • SM: 15日と月末ごと
  • Q: 四半期末ごと
  • AまたはY: 年末ごと

M, Q, AまたはYについては期間の末日が対象となるが、先頭にBを付けると営業日(月曜 - 金曜)、末尾にSをつけると末日ではなく開始日となる。

例えば、

  • BM: 月末最終営業日ごと
  • MS: 毎月の開始日ごと
  • BMS: 毎月の最初の営業日ごと

となる。Q, AまたはYでも同様。

MMS, 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-SUNWと同じ), 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, Tmin), S, Lms), Uus), 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')

関連カテゴリー

関連記事