bisect はソート済みリストに対して高速に範囲検索ができます。日時データ(ログのタイムスタンプなど)を扱う場合も同じ考え方で使えます。
基本の流れ
- 日時データをソート済みリストにする(昇順が前提)
- 検索範囲の開始時刻と終了時刻を指定
bisect_leftとbisect_rightで範囲のインデックスを取得- スライスで対象範囲を抽出
具体例
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),
]
# 検索範囲(10:00〜11:00)
start_time = datetime(2025, 11, 29, 10, 0)
end_time = datetime(2025, 11, 29, 11, 0)
# 範囲のインデックスを取得
start_index = bisect.bisect_left(logs, start_time)
end_index = bisect.bisect_right(logs, end_time)
# 範囲抽出
subset = logs[start_index:end_index]
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
応用例
- ログ解析: 特定時間帯のエラーやイベントを抽出
- センサー記録: 一日の中で特定時間帯のデータを取り出す
- 金融データ: 株価や取引履歴から時間範囲を抽出
まとめ
bisect_leftとbisect_rightを使えば、日時データの範囲検索が高速にできる- ソート済みリストが前提
- 大規模ログ解析や時系列データ処理に非常に便利

