Python 時間処理の核心:time と datetime モジュールの実践ガイド

Python の標準ライブラリには、日時操作を支援する time および datetime モジュールが含まれています。これらは異なる抽象レベルで時間情報を扱い、用途に応じて使い分ける必要があります。

time モジュール:低レイヤーな時間表現

time モジュールは、システムレベルの時間操作に焦点を当てており、主に以下の三種類の形式で時間を表現します:

  • Unix タイムスタンプ:1970年1月1日 00:00:00 UTC からの経過秒数(浮動小数点数)
  • 構造化時間オブジェクトtime.struct_time 型のタプル風インスタンス(例:tm_year, tm_mon, tm_wday など)
  • フォーマット済み文字列:人間が読みやすい任意の文字列形式(例:"2024-06-15 14:30:45"

これらの形式は相互に変換可能であり、構造化時間オブジェクトが中継ノードとして機能します。

タイムスタンプの取得と活用

import time

# 現在のUTC基準タイムスタンプ(秒単位+マイクロ秒)
current_epoch = time.time()
print(f"現在のタイムスタンプ: {current_epoch:.6f}")  # 例: 1718452238.123456

構造化時間オブジェクトの生成と操作

# ローカルタイムゾーンでの現在時刻
local_struct = time.localtime()
print(f"ローカル時間: {local_struct.tm_year}年{local_struct.tm_mon}月{local_struct.tm_mday}日")

# UTC 時間(GMT と同一)
utc_struct = time.gmtime()
print(f"UTC時間: {utc_struct.tm_hour}時(ローカル比約8時間遅れ)")

# タイムスタンプから構造化オブジェクトへ変換
custom_struct = time.localtime(1718452238)

フォーマット変換の実装

構造化時間オブジェクトを任意の文字列形式に変換するには strftime() を使用します:

formatted = time.strftime("%Y/%m/%d %a %H:%M:%S", local_struct)
# 出力例: "2024/06/15 Sat 14:30:45"

# 特定の書式指定子の意味:
# %Y → 4桁西暦、%m → 月(01〜12)、%d → 日(01〜31)
# %a → 曜日の省略形(Sun)、%H → 24時間制時(00〜23)
# %M → 分(00〜59)、%S → 秒(00〜59)

文字列から構造化オブジェクトへの復元

raw_string = "2024/06/15 14:30:45"
parsed = time.strptime(raw_string, "%Y/%m/%d %H:%M:%S")
print(parsed.tm_wday)  # 5 → 土曜日(0=月〜6=日)

時間差の計算

start = time.time()
# 何かの処理(例:time.sleep(2.5))
end = time.time()
elapsed_seconds = end - start
print(f"処理時間: {elapsed_seconds:.3f}秒")

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

datetime は、より直感的で柔軟なクラス設計を提供し、主に以下の4つの主要クラスで構成されます:

  • date:年・月・日のみを保持
  • time:時・分・秒・マイクロ秒のみを保持(タイムゾーン対応可)
  • datetimedatetime を統合した完全な日時情報
  • timedelta:時間の差分(加減算に使用)

date クラスの活用

from datetime import date

# 今日の日付
today = date.today()
print(f"本日: {today.isoformat()}")  # 例: "2024-06-15"

# 特定日付の生成
birth = date(1992, 8, 24)
print(f"誕生日: {birth}")

# タイムスタンプから日付生成
from_timestamp = date.fromtimestamp(1718452238)

# 属性アクセス
print(f"年={birth.year}, 月={birth.month}, 日={birth.day}")

# 日付の更新(不変オブジェクトのため新規インスタンス生成)
next_year = birth.replace(year=birth.year + 1)

time クラスの活用

from datetime import time

# 時刻の生成(マイクロ秒も指定可能)
meeting = time(15, 45, 30, 123456)
print(f"会議開始: {meeting}")

# 時刻属性の抽出
print(f"時={meeting.hour}, 分={meeting.minute}, 秒={meeting.second}")

# 時刻の置換
rescheduled = meeting.replace(hour=16, minute=0)

datetime クラスの統合的操作

from datetime import datetime

# 現在時刻(ローカル)
now_local = datetime.now()
print(f"現地時間: {now_local}")

# UTC 時刻
now_utc = datetime.utcnow()
print(f"UTC時間: {now_utc}")

# 文字列から解析
parsed_dt = datetime.strptime("2024-06-15T15:45:30", "%Y-%m-%dT%H:%M:%S")

# タイムスタンプ変換
ts = now_local.timestamp()  # float(秒単位)

# 文字列フォーマット
formatted_dt = now_local.strftime("%B %d, %Y at %I:%M %p")
# 出力例: "June 15, 2024 at 03:45 PM"

timedelta を用いた期間演算

from datetime import datetime, timedelta

# 5日後、3時間前などの差分定義
future = datetime.now() + timedelta(days=5, hours=3)
past = datetime.now() - timedelta(weeks=2, minutes=15)

# 二つの日時の差を取得
start = datetime(2024, 6, 1, 9, 0)
end = datetime(2024, 6, 15, 17, 30)
duration = end - start
print(f"期間: {duration.days}日 {duration.seconds // 3600}時間")

タグ: Python time datetime timedelta strftime

6月28日 02:00 投稿