Pythonにおける時間処理の核心:timeとdatetimeの実践的比較

Pythonでは、時間情報の取得・変換・演算を行うために、timeおよびdatetimeという2つの標準ライブラリが提供されています。両者は標準搭載であり、追加インストールは不要です。ただし、その設計思想と使用目的には明確な違いがあります。

timeモジュール:低レイヤーな時刻操作

timeはC言語で実装された軽量なモジュールで、主にシステム時刻の取得や高精度な計測に適しています。基本的な時間表現は3種類です:

  • Unixタイムスタンプ(浮動小数点数):1970年1月1日00:00:00 UTCからの経過秒数
  • struct_time(名前付きタプル):年・月・日・時・分・秒など9要素を持つ構造体
  • フォーマット済み文字列(例:"Mon Apr 1 14:22:05 2024"

以下は代表的な変換パターンです:

# タイムスタンプ → struct_time(ローカル時刻)
local_tuple = time.localtime(1712068925.123)

# struct_time → タイムスタンプ
ts = time.mktime(local_tuple)

# タイムスタンプ → フォーマット文字列
formatted = time.ctime(1712068925.123)  # "Mon Apr  1 14:22:05 2024"

# struct_time → カスタムフォーマット文字列
custom = time.strftime("%Y/%m/%d %H:%M", local_tuple)

# 文字列 → struct_time
parsed = time.strptime("2023/12/25 09:30", "%Y/%m/%d %H:%M")

実行時間の計測など、パフォーマンスが重要な用途では、time.time()による差分計算が最も効率的です:

start = time.time()
# 処理ブロック
result = sum(range(10**6))
elapsed = time.time() - start
print(f"処理時間: {elapsed:.4f}秒")

datetimeモジュール:高レベルな日付・時刻操作

datetimetimeを基盤に構築された、オブジェクト指向の時間処理ライブラリです。主なクラスはdatetimedatetime、および期間を表すtimedeltaです。

基本的なインスタンス生成例:

from datetime import datetime, date, time, timedelta

# 現在の日時
now = datetime.now()

# 現在の日付のみ
today = date.today()

# 指定日時の作成
meeting = datetime(2024, 5, 15, 10, 30, 0)

# 日付と時刻の分離
only_date = meeting.date()   # dateオブジェクト
only_time = meeting.time() # timeオブジェクト

文字列との相互変換にはstrftimestrptimeメソッドを使います:

# datetime → 文字列
iso_str = now.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3]  # ミリ秒まで

# 文字列 → datetime
parsed_dt = datetime.strptime("2024-04-01T08:45:30", "%Y-%m-%dT%H:%M:%S")

# ISO形式の簡易変換(推奨)
iso_parsed = datetime.fromisoformat("2024-04-01T08:45:30.123")

日付演算にはtimedeltaが不可欠です:

# 3日後の日付
future = now + timedelta(days=3)

# 2時間15分前の時刻
past = now - timedelta(hours=2, minutes=15)

# 2つの日時の差(timedeltaオブジェクト)
diff = future - now  # timedelta(days=3)

比較も直感的です:

if now > meeting:
    print("会議はすでに終了しています")
elif now == meeting:
    print("会議が始まりました")

選択の指針

  • 計測・高速処理time.time()time.perf_counter()を使用。マイクロ秒精度が必要なベンチマークにも対応。
  • 日付計算・人間向け表示datetimeが最適。月単位の加算、月末判定、タイムゾーン対応(zoneinfoと組み合わせ)など、業務ロジックに必要な機能が充実。
  • タイムゾーン対応:Python 3.9以降ではzoneinfoモジュールとdatetimeを併用し、IANAタイムゾーンデータベースに基づく正確な変換が可能。

例えば、東京とロンドンの同時刻を扱う場合:

from zoneinfo import ZoneInfo
from datetime import datetime

tokyo = datetime.now(ZoneInfo("Asia/Tokyo"))
london = tokyo.astimezone(ZoneInfo("Europe/London"))
print(f"東京: {tokyo}, ロンドン: {london}")

タグ: Python time datetime zoneinfo timedelta

9月2日 01:05 投稿