Python | 日時データの範囲検索を bisect と pandas で比較

Python
スポンサーリンク

同じ「10:00〜11:00 の範囲のログを抽出する」という課題を、標準ライブラリの bisect とデータ分析ライブラリの pandas で書き比べてみましょう。


bisect を使った場合(標準ライブラリ)

import bisect
from datetime import datetime

# ソート済みのログタイムスタンプ
logs = [
    datetime(2025, 11, 29, 9, 0),
    datetime(2025, 11, 29, 9, 30),
    datetime(2025, 11, 29, 10, 0),
    datetime(2025, 11, 29, 10, 30),
    datetime(2025, 11, 29, 11, 0),
    datetime(2025, 11, 29, 11, 30),
]

# 範囲指定
start_time = datetime(2025, 11, 29, 10, 0)
end_time   = datetime(2025, 11, 29, 11, 0)

# bisectでインデックスを取得
start_idx = bisect.bisect_left(logs, start_time)
end_idx   = bisect.bisect_right(logs, end_time)

subset = logs[start_idx:end_idx]

print("対象範囲:")
for log in subset:
    print(log.strftime("%Y-%m-%d %H:%M"))
Python

実行結果

対象範囲:
2025-11-29 10:00
2025-11-29 10:30
2025-11-29 11:00
  • 特徴: 軽量で高速。ソート済みリストから範囲を抜き出すだけなら最適。
  • 制約: リストがソート済みである必要がある。ラベルや複雑条件は扱いにくい。

pandas を使った場合(DataFrame)

import pandas as pd

# DataFrameにログを格納
df = pd.DataFrame({
    "timestamp": pd.date_range("2025-11-29 09:00", periods=6, freq="30min"),
    "event": ["start", "check", "error", "check", "end", "cleanup"]
})

# 範囲指定
start_time = pd.Timestamp("2025-11-29 10:00")
end_time   = pd.Timestamp("2025-11-29 11:00")

# betweenで範囲抽出
subset = df[df["timestamp"].between(start_time, end_time)]

print(subset)
Python

実行結果

            timestamp   event
2 2025-11-29 10:00:00   error
3 2025-11-29 10:30:00   check
4 2025-11-29 11:00:00     end
  • 特徴: between で直感的に書ける。複数列や複雑条件も簡単に組み合わせ可能。
  • 制約: pandas をインポートする必要があり、小規模データではオーバーエンジニアリングになることも。

並べて比較

項目bisectpandas
データ構造ソート済みリストDataFrame(表形式)
コード量インデックス計算+スライスbetween で一行
適用範囲単純な範囲検索複数列・複雑条件検索
データ規模小〜中規模中〜大規模
可読性Python標準で軽量データ分析に最適で直感的

まとめ

  • bisect: 軽量で高速。ソート済みリストから範囲を抜き出すだけなら最適。
  • pandas: 大規模データや複雑な条件検索に強い。ログ解析や時系列データ処理に便利。

👉 小規模・単純検索 → bisect
👉 大規模・複雑検索 → pandas

Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました