【Python】PandasのDataFrameで、毎日・毎時間などの時系列のindexを作る方法(pandas.date_range)

背景

  • PandasDataFrameの時系列データを取り扱っている際に、毎日や毎時間といったdatetime型のindexが必要になることがあります。
  • 時系列のindexstr型で作成してしまうこともありますが、データの抽出や加工のことを考えるとしっかりとdatetime型のindexを使いたいというニーズがあると思います。
  • pandas.date_rangeを使用すれば簡単に作成できるので作成方法を紹介します。

目標

  • Pandasdatetime型のindexを自在に作成できるようになる。

pandas.date_rangeを使用し、datetime型のindexを持つDataFrameを作成する方法

  • pandas.date_rangeの使い方は簡単で、以下のように、startendindexを作成したい期間を指定するだけで、等差のdatetime型のindexが作成されます。
import pandas as pd
import numpy as np

#毎日(date)のDatetimeIndexを作成する。(期間指定)
date_index = pd.date_range(start='2023-01-01', end='2023-01-05')

print(date_index)
#DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
#               '2023-01-05'],
#              dtype='datetime64[ns]', freq='D')
  • 上記で作成した、DatetimeIndexindexに指定してdfを作成します。
#上記で作成した、DatetimeIndexをindexに指定してdfを作成する。
df = pd.DataFrame(np.arange(5).reshape(5, 1), columns = ['data'], index = date_index)

print(df)
#                     data
#2023-01-01 00:00:00     0
#2023-01-01 06:00:00     1
#2023-01-01 12:00:00     2
#2023-01-01 18:00:00     3
#2023-01-02 00:00:00     4
  • 作成したdfindexDatetimeIndexとなっているかを確認します。
#dfのindexがDatetimeIndexになっているか確認する。
print(df.info())
#<class 'pandas.core.frame.DataFrame'>
#DatetimeIndex: 5 entries, 2018-01-01 to 2018-01-05
#Freq: D
#Data columns (total 1 columns):
# #   Column  Non-Null Count  Dtype
#---  ------  --------------  -----
# 0   data    5 non-null      int64
#dtypes: int64(1)
#memory usage: 80.0 bytes

その他pandas.date_rangeの様々な使い方

毎日(date)のDatetimeIndexを作成(indexの作成個数指定:前から)

#毎日(date)のDatetimeIndexを作成する。(indexの作成個数指定:前から)
date_index = pd.date_range(start='2023-01-01', periods=8)

print(date_index)
# DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
#                '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08'],
#               dtype='datetime64[ns]', freq='D')

毎日(date)のDatetimeIndexを作成(indexの作成個数指定:後ろから)

#毎日(date)のDatetimeIndexを作成する。(indexの作成個数指定:後ろから)
date_index = pd.date_range(end='2023-01-01', periods=8)

print(date_index)
# DatetimeIndex(['2022-12-25', '2022-12-26', '2022-12-27', '2022-12-28',
#                '2022-12-29', '2022-12-30', '2022-12-31', '2023-01-01'],
#               dtype='datetime64[ns]', freq='D')

タイムゾーン(tz)を追加したindexの作成

#タイムゾーン(tz)を追加したindexを作成する。
date_index = pd.date_range(start='2023-01-01', periods=8, tz='Asia/Tokyo')

print(date_index)
# DatetimeIndex(['2023-01-01 00:00:00+09:00', '2023-01-02 00:00:00+09:00',
#                '2023-01-03 00:00:00+09:00', '2023-01-04 00:00:00+09:00',
#                '2023-01-05 00:00:00+09:00', '2023-01-06 00:00:00+09:00',
#                '2023-01-07 00:00:00+09:00', '2023-01-08 00:00:00+09:00'],
#               dtype='datetime64[ns, Asia/Tokyo]', freq='D')

指定期間を等分に分割した時刻のindexの作成

#指定期間を等分に分割した時刻のindexを作成する。
date_index = pd.date_range(start='2023-01-01', end='2023-01-02', periods=5)

print(date_index)
# DatetimeIndex(['2023-01-01 00:00:00', '2023-01-01 06:00:00',
#                '2023-01-01 12:00:00', '2023-01-01 18:00:00',
#                '2023-01-02 00:00:00'],
#               dtype='datetime64[ns]', freq=None)

指定時刻から指定個数の時間を等差時間で増加するindexの作成

#指定時刻から指定個数の時間を等差時間で増加するindexを作成する。
#1ヶ月ごと(M)
date_index = pd.date_range(start='2023-01-01', periods=5, freq='M')

print(date_index)
# DatetimeIndex(['2023-01-31', '2023-02-28', '2023-03-31', '2023-04-30',
#                '2023-05-31'],
#               dtype='datetime64[ns]', freq='M')

#1日ごと(D)
date_index = pd.date_range(start='2023-01-01', periods=5, freq='D')

print(date_index)
# DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
#                '2023-01-05'],
#               dtype='datetime64[ns]', freq='D')

#1時間ごと(h)
date_index = pd.date_range(start='2023-01-01', periods=5, freq='h')

print(date_index)
# DatetimeIndex(['2023-01-01 00:00:00', '2023-01-01 01:00:00',
#                '2023-01-01 02:00:00', '2023-01-01 03:00:00',
#                '2023-01-01 04:00:00'],
#               dtype='datetime64[ns]', freq='H')

#1分ごと(min)
date_index = pd.date_range(start='2023-01-01', periods=5, freq='min')

print(date_index)
# DatetimeIndex(['2023-01-01 00:00:00', '2023-01-01 00:01:00',
#                '2023-01-01 00:02:00', '2023-01-01 00:03:00',
#                '2023-01-01 00:04:00'],
#               dtype='datetime64[ns]', freq='T')

#1秒ごと(s)
date_index = pd.date_range(start='2023-01-01', periods=5, freq='s')

print(date_index)
# DatetimeIndex(['2023-01-01 00:00:00', '2023-01-01 00:00:01',
#                '2023-01-01 00:00:02', '2023-01-01 00:00:03',
#                '2023-01-01 00:00:04'],
#               dtype='datetime64[ns]', freq='S')

参考資料

pandas.date_range — pandas 2.1.4 documentation

Qiita記事

【Python】PandasのDataFrameで、毎日・毎時間などの時系列のindexを作る方法(pandas.date_range) - Qiita
背景PandasのDataFrameの時系列データを取り扱っている際に、毎日や毎時間といったdatetime型のindexが必要になることがあります。時系列のindexはstr型で作成してしまう…