順番に読み進めながら学べます

datetime と time — 日付・時刻・経過時間の扱い方

Python の datetime / time / calendar モジュールを基礎から解説します。date と datetime と timedelta による日付計算、strftime / strptime による文字列変換、time.perf_counter での経過時間計測まで、ハンズオンで学べます。

日付・時刻・経過時間 を扱う 3 つの標準ライブラリ — datetime / time / calendar を整理します。date / datetime / timedelta による日付計算、strftime / strptime での文字列との相互変換、time.perf_counter での経過時間計測までを順に見ていきます。

date / datetime / timedelta — 日付の作成と差の計算

Python で日付を扱うときは datetime モジュールにある 3 つのクラス を使い分けます。date は年月日だけ、datetime は年月日 + 時分秒、そして timedelta「3 日間」「2 時間」のような期間 を表します。date + timedelta で「3 日後」が計算でき、date - date2 つの日付の差timedelta として返ってくる、という対称な設計になっています。

date / datetime / timedelta の関係
date年・月・日datetime年・月・日 + 時刻timedelta期間(差や加算)
date と datetime は時点を表し、timedelta はその差や加算量を表す
クラス持つ情報代表的な使いどころ
date年・月・日誕生日、注文日など日付だけが意味を持つもの
datetime年月日 + 時・分・秒ログ・ファイル更新日時など時刻まで必要なもの
timedelta日数 / 秒数 / マイクロ秒「3 日後」「経過時間」など期間を表す
time時・分・秒(日付なし)「営業時間 9:00〜18:00」のような時刻のみ
datetime ライブラリで日付計算をする流れ
date(2024, 3, 15)作成+ timedelta(days=3)date(2024, 3, 18)結果+ timedelta= 新しい date
date + timedelta で日付計算ができる。差は date2 - date1timedelta が返る。
from datetime import date, datetime, timedelta

# 日付の作成
order_date = date(2024, 3, 15)
print(order_date)            # 2024-03-15

# 3 日後を計算
delivery = order_date + timedelta(days=3)
print(delivery)              # 2024-03-18

# 2 つの date の差は timedelta
elapsed = delivery - order_date
print(elapsed.days)          # 3

# 現在時刻
now = datetime.now()
print(now.year, now.month, now.day)

datetime.now と環境依存性

datetime.now()動かしているマシンの現在時刻 を返すので、ブラウザの Pyodide ランタイムでも実機でも、実行ごとに値が変わります。演習では値が固定の date(2024, 3, 15) を使い、now() の動作確認は別途コンソールで個別に試すと比較しやすいです。

注文日 2024-03-15 から 3 日後の発送日と 14 日後の支払期限を計算 します。

① datetime から datetimedelta を読み込み、注文日 date(2024, 3, 15) を作ってください

② 発送日 = 注文日 + timedelta(days=3)、支払期限 = 注文日 + timedelta(days=14) を計算してください

発送日: ◯◯ / 支払期限: ◯◯ の形で 2 つを表示してください

Python エディタ

コードを実行してください

2 つの日付の差を求める

date 同士の引き算timedelta オブジェクトを返します。.days 属性で 日数だけ を取り出せるので、「あと何日?」のような質問に対する整数値が得られます。

実践 1 の発送日と支払期限から、その間の日数を計算します

① 実践 1 と同じ注文日・発送日・支払期限を再現してください

pay_due - ship_datetimedelta を求めて、その .days 属性を取り出してください

間隔: ◯ 日 の形で日数を表示してください

Python エディタ

コードを実行してください

strftime / strptime — 日付と文字列の相互変換

ファイルやログ・JSON に含まれる日付は 文字列 で渡されることがほとんどです。Python では strftime(format time)datetime → 文字列strptime(parse time)文字列 → datetime に変換します。両方とも 書式コード を指定して、%Y が 4 桁年、%m が 2 桁月、というように 記号と意味を対応 させます。

strftime と strptime の対称性
datetimeオブジェクト文字列'2024-03-15'%Y-%m-%d などの書式コードdatetimeオブジェクト文字列'2024-03-15'strftime (format)strptime (parse)
strftime は datetime をフォーマット文字列で 書き出すstrptime は同じ書式で 読み取る。f が format、p が parse の頭文字。書式コード(%Y, %m, %d 等)は両方で同じものを使う。
書式コード意味
%Y4 桁の年2024
%m2 桁の月 (01-12)03
%d2 桁の日 (01-31)15
%H2 桁の時 24 時間 (00-23)14
%M2 桁の分 (00-59)30
%S2 桁の秒 (00-59)00
%A曜日名 (英語)Friday
%w曜日 (0=Sun, 6=Sat)5
from datetime import datetime

# 文字列 → datetime
text = "2024-03-15 14:30:00"
dt = datetime.strptime(text, "%Y-%m-%d %H:%M:%S")
print(dt.year, dt.month, dt.day)   # 2024 3 15

# datetime → 文字列
dt2 = datetime(2024, 3, 15, 14, 30)
print(dt2.strftime("%Y/%m/%d"))               # 2024/03/15
print(dt2.strftime("%Y年%m月%d日 %H:%M"))      # 2024年03月15日 14:30

書式不一致は ValueError になる

strptime("2024/03/15", "%Y-%m-%d") のように 文字列の区切り書式コード がズレると ValueError で落ちます。入力データの実際の書式 をよく見て、ハイフンならハイフン、スラッシュならスラッシュで揃えること。年月日とコロン区切りの時刻が混ざる "2024-03-15T14:30:00" のような ISO 形式を扱うときは datetime.fromisoformat(text) のほうが楽です。

ログの日時文字列 "2024-03-15 14:30:45" を datetime オブジェクトに変換し、別の書式で再フォーマット します。

① datetime モジュールから datetime クラスを読み込んでください

② 上記の日時文字列を変数に入れてください

③ 文字列を datetime オブジェクトに パース してください(書式コードで元文字列の並びを指定します)。続けて type(変換後).__name__型: datetime の形で表示してください

④ 変換した datetime から 年・月・日 を属性で取り出して、年: ◯ 月: ◯ 日: ◯ の形で表示してください(d.year / d.month / d.day で取り出します)

⑤ 同じ datetime を 年/月/日 時:分 の書式(時分まで、秒は省略)に整形してください。続けて type(整形後).__name__整形後の型: str の形で型を表示し、整形後: ◯◯ の形で値も表示してください(datetime → str に戻っていることを確認)

Python エディタ

コードを実行してください

time と calendar — 経過時間の計測と月情報

time モジュールは datetime とは別 で、より低レベルな時刻 API を提供します。よく使うのは time.perf_counter() で、これは 「現在の経過時間(秒、float)」 を返す高精度カウンタです。処理の前後で 2 回呼んで差を取れば 実行時間が測れます。一方 calendar モジュールは その月が何日まであるか月初の曜日 といった カレンダー情報 を取り出すのに使います。

time.time と time.perf_counter の使い分け
time.time()Unix 時刻 (秒)time.perf_counter()単調増加カウンタログのタイムスタンプ絶対時刻が必要なとき実行時間の計測相対時間で十分なとき
time.time1970 年 1 月 1 日 0:00 (UTC) からの秒数(Unix 時刻)を返す。time.perf_counter基準時刻不明だが単調増加 する高精度カウンタで、経過時間の計測に向く
関数返す値用途
time.time()Unix 時刻 (float)現在時刻のタイムスタンプ
time.perf_counter()単調増加カウンタ (float, 秒)実行時間の計測
calendar.monthrange(y, m)(月初の曜日, 月末の日) のタプル月のカレンダー情報
calendar.isleap(y)True / Falseうるう年か判定
import time
import calendar

# 実行時間の計測
start = time.perf_counter()
total = sum(range(100000))
elapsed = time.perf_counter() - start
print("合計:", total)
print("型:", type(elapsed).__name__)   # float

# カレンダー情報
weekday, last_day = calendar.monthrange(2024, 2)   # (月初の曜日, 月末の日)
print("2024年2月の月末:", last_day, "日")
print("うるう年:", calendar.isleap(2024))

time.time ではなく perf_counter を使う理由

time.time()Unix 時刻(秒の小数)を返しますが、マシンの時計が NTP で巻き戻ると差がマイナスになる ことがあります。time.perf_counter()単調増加(ずっと増え続ける) が保証されていて、経過時間の計測に専用設計 なので、ストップウォッチ用途では常にこちらを選びます。

経過時間の計測と月情報の取得 を組み合わせて書きます。

① time と calendar を読み込んでください

② ストップウォッチを開始してください(経過時間用の高精度カウンタを使います)

0 から 49999 までの整数を合計する計算を実行してください

④ 経過時間を計算し、合計: ◯経過時間は 0 秒以上: True の形で表示してください(実時間は環境差があるため、ここでは 0 以上であることだけを確認します)

⑤ 2024 年 2 月の月末日を 2月末: ◯ 日、うるう年判定を うるう年: True / False の形で表示してください

Python エディタ

コードを実行してください

time.sleep — 一定時間待つ

`time.sleep(秒数)`指定した秒数だけプログラムの実行を止める 関数です。リトライ間隔・レート制限・アニメーション制御などで頻出します。引数は float なので time.sleep(0.5) のような小数も渡せます。本演習はブラウザ上で動かすため、長時間の sleep は避けて 0〜1 秒程度で挙動を確認します。

`time.sleep` で実行を止め、経過時間が 0.3 秒以上だったか確認 します。実時間は環境ごとにわずかに揺れるので、ここでは 「0.3 秒以上経過したか」 という真偽値で確認します。

time をインポートしてください

time.perf_counter() で開始時刻を記録してください

time.sleep(0.3) で 0.3 秒だけ待ってください

④ 経過時間 time.perf_counter() - 開始時刻 を計算し、>= 0.30.3 秒以上経過: True / False の形で表示してください

(正しく実行できれば解説が表示されます)

Python エディタ

コードを実行してください
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1「3 日後」を計算する ときに使うのはどの組み合わせですか?

Q2文字列 "2024/03/15" を datetime に変換するときに使う書式はどれですか?

Q3実行時間の計測 に最も向いているのはどれですか?

Q4ISO 8601 形式の文字列 "2024-03-15T14:30:00" を datetime にする最も簡単な書き方はどれですか?