AIで作成した草稿と合成データの小さな例です。製品コードを公開したものではありません。
データを比較するとき、取得時刻がないレコードを「イベント後」と同じFalseにまとめると、時刻が不明だった事実を失います。ここではpre_event、not_pre_event、unknownを分けます。境界時刻と同時の記録も、事前保存には含めません。
from datetime import datetime, timezone
def before_event(saved_at, event_at):
if saved_at is None or event_at is None:
return "unknown"
if saved_at.tzinfo is None or event_at.tzinfo is None:
raise ValueError("timezone required")
saved = saved_at.astimezone(timezone.utc)
event = event_at.astimezone(timezone.utc)
return "pre_event" if saved < event else "not_pre_event"
この関数は時刻の前後だけを分類します。データソースが正しいことや、保存時刻が改変されていないことは証明しません。実際に「事前」と呼ぶには、当時の保存記録を別に確認する必要があります。
確認したい境界は、取得時刻なし、イベント時刻なし、同時刻、タイムゾーンのない値、異なるオフセットで表した同一時刻です。比較の入口でunknownを残すと、後段の集計で除外理由を説明できます。
前日の記事が扱った比較キーとは別に、この記事は不明な時刻を二値に押し込まない点に絞りました。型や戻り値を増やす理由が、欠損の意味を保つためであることが大切です。
関連する読み方の例として、開発しているSIGNUM HQの無料診断を末尾に一つだけ置きます。この記事のコードが同サービスの実装だという意味ではありません。