Python
 Computer >> コンピューター >  >> プログラミング >> Python

インデックス値に基づいてDataFrameの時系列データを切り詰めるプログラムを作成する方法

pandasのDataFrameで時系列データを扱う際、「特定の日付範囲のデータだけを抽出したい」という場面はよくあります。本記事では、truncate()メソッドを使って、インデックス値に基づいて時系列データを切り詰めるプログラムの作成方法を解説します。

処理前後のイメージ

週次の時系列データを持つDataFrameに対してtruncate()を適用すると、指定した範囲のデータのみが残ります。処理前後の出力は以下の通りです。

before truncate:
   Id time_series
0   1  2020-01-05
1   2  2020-01-12
2   3  2020-01-19
3   4  2020-01-26
4   5  2020-02-02
5   6  2020-02-09
6   7  2020-02-16
7   8  2020-02-23
8   9  2020-03-01
9  10  2020-03-08

after truncate:
  Id time_series
1   2  2020-01-12

解決手順

以下の手順でプログラムを作成していきます。

  1. DataFrameを定義する:Id列(1〜10)を持つDataFrameを作成します。
  2. date_range()で日付列を生成する:start='01/01/2020'、periods=10、freq='W'(週次)を指定したpd.date_range()により、開始日から1週間ごとの日付が10個生成され、df['time_series']に格納されます。
  3. truncate()でデータを切り詰める:df.truncate()にbefore='01/01/2020'、after='10/02/2020'を指定して呼び出し、結果をresultに保存します。

まず、date_range()で日付列を生成する部分のコードです。

df['time_series'] = pd.date_range('01/01/2020',
                                  periods=10,
                                  freq='W')

続いて、truncate()を適用して結果を取得します。

result = df.truncate(before='01/01/2020', after='10/02/2020')

コード例(全体)

ここまでの手順をすべてまとめた実装例が以下です。

import pandas as pd

d = {'Id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
df = pd.DataFrame(d)
df['time_series'] = pd.date_range('01/01/2020',
                                  periods=10,
                                  freq='W')

print(df)
result = df.truncate(before='01/01/2020', after='10/02/2020')
print(result)

実行結果

before truncate:
   Id time_series
0   1  2020-01-05
1   2  2020-01-12
2   3  2020-01-19
3   4  2020-01-26
4   5  2020-02-02
5   6  2020-02-09
6   7  2020-02-16
7   8  2020-02-23
8   9  2020-03-01
9  10  2020-03-08

after truncate:
  Id time_series
1   2  2020-01-12

補足:truncate()メソッドのポイント

truncate()は、before引数で指定した値より前の行と、after引数で指定した値より後ろの行を除外し、その間のデータだけを残すメソッドです。時系列データから特定の期間だけを分析対象にしたい場合などに活躍します。なお、日付文字列で範囲を指定する場合は、対象となるインデックスが適切にソートされている必要がある点に注意しましょう。

  1. MatplotlibでPandasデータフレームの時刻をインデックス値としてプロットする方法

    MatplotlibでPandasデータフレームの時刻(タイムスタンプ)をインデックス値として扱い、時系列グラフを描くには、set_index()メソッドを使って時刻列をインデックスに設定するのが最も簡単な方法です。以下に具体的な手順とコード例を示します。 実装手順 rcParamsを使って図のサイズを設定し、サブプロット間および周囲の余白(パディング)を自動調整します。 time(時刻)とspeed(速度)の2つの列を持つPandasデータフレームを作成します。時刻にはpd.date_range()を使って一定間隔のタイムスタンプを生成します。 set_index(time)で既存の「ti

  2. Pythonで偶数インデックスの小文字アルファベットから5つのランダム値を持つSeriesを生成する方法

    Pythonでは、stringモジュールとrandomモジュール、そしてpandasを組み合わせることで、小文字アルファベットの中から偶数インデックスの文字だけを抽出し、その中からランダムに5つ選んでSeriesを生成できます。ここでは2つの解決方法を紹介します。 解決方法1:スライスを使った効率的なアプローチ この方法では、以下の手順で処理を行います。 string.ascii_lowercaseで小文字アルファベット(a〜z)を取得し、リスト化します。 Pythonのスライス記法[::2]を使うことで、偶数インデックスの要素だけを簡単に抽出できます。 random.sample()で抽出