Pythonでアプリケーションを開発する際、日付や時刻の扱いは避けて通れない要素の一つです。
ログの出力、データベースへの保存、ユーザーインターフェースへの表示など、あらゆる場面で「日時オブジェクト」と「文字列」の相互変換が必要になります。
Pythonの標準ライブラリであるdatetimeモジュールには、この変換を自在に操るための強力なメソッドとしてstrftimeとstrptimeが用意されています。
これら2つのメソッドは名前が似ているため、初心者のうちはどちらがどちらの役割を持つのか混乱しがちです。
しかし、それぞれの役割と書式指定コードのルールを一度理解してしまえば、日付操作の自由度は飛躍的に向上します。
本記事では、2026年現在の標準的な開発環境を前提に、これらのメソッドの使い方から実戦で役立つ書式指定、注意すべきポイントまでを詳しく解説します。
Pythonにおける日付・時刻処理の基本
Pythonで日付や時刻を扱う中心的な存在は、datetimeモジュールです。
このモジュールには、日付のみを扱うdateクラス、時刻のみを扱うtimeクラス、そしてその両方を保持するdatetimeクラスが含まれています。
変換メソッドを学ぶ前に、まずは基準となるdatetimeオブジェクトを生成する方法を確認しておきましょう。
from datetime import datetime
# 現在の日時を取得
now = datetime.now()
print(now)
print(type(now))
2026-05-06 14:30:15.123456
<class 'datetime.datetime'>
このように、datetime.now()を使用すると現在の時刻情報を持つオブジェクトが生成されます。
しかし、このオブジェクトのままでは、特定のフォーマットで画面に表示したり、テキストファイルに書き出したりするには不向きです。
そこで登場するのが、strftimeメソッドです。
strftime:日付オブジェクトを文字列に変換する
strftimeという名前は、string from time(時刻から文字列へ)に由来しています。
このメソッドは、datetimeオブジェクトが持つ情報を、指定した書式に従って文字列として出力します。
strftimeの基本構文
strftimeは、datetimeオブジェクトのインスタンスメソッドとして呼び出します。
引数には、どのような形式で出力したいかを示す「書式指定文字列」を渡します。
from datetime import datetime
now = datetime(2026, 5, 6, 14, 30, 0)
# 標準的な日付表記に変換
fmt_a = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"形式A: {fmt_a}")
# 日本語を含んだ表記に変換
fmt_b = now.strftime("%Y年%m月%d日 %H時%M分")
print(f"形式B: {fmt_b}")
形式A: 2026-05-06 14:30:00
形式B: 2026年05月06日 14時30分
よく使われる書式指定コード
strftimeで使用する書式指定コードは多岐にわたりますが、頻繁に利用されるものは限られています。
以下の表に主要なコードをまとめました。
| コード | 意味 | 例(2026年5月6日 14時30分の場合) |
|---|---|---|
| %Y | 西暦4桁 | 2026 |
| %y | 西暦下2桁 | 26 |
| %m | 月 (0埋め) | 05 |
| %d | 日 (0埋め) | 06 |
| %H | 時 (24時間制, 0埋め) | 14 |
| %I | 時 (12時間制, 0埋め) | 02 |
| %M | 分 (0埋め) | 30 |
| %S | 秒 (0埋め) | 00 |
| %A | 曜日の名称 (英語) | Wednesday |
| %a | 曜日の略称 (英語) | Wed |
| %p | AMまたはPM | PM |
ここで注意が必要なのは、%m(月)と%M(分)の混同です。
大文字と小文字の違いだけで意味が大きく異なるため、記述の際は必ず確認するようにしましょう。
また、月と日はデフォルトで0埋めされた2桁の数値として出力されます。
strptime:文字列を日付オブジェクトに変換する
一方で、外部から入力された文字列(CSVファイルのデータやWebフォームの入力値など)を計算や比較が可能な日付オブジェクトに戻したい場合があります。
このときに使用するのが、strptimeメソッドです。
名前の由来は、string parse time(文字列を解析して時刻へ)です。
strptimeの基本構文
strptimeはクラスメソッドであるため、datetime.strptime()のように呼び出します。
第一引数に「変換したい文字列」、第二引数に「その文字列の書式」を指定します。
from datetime import datetime
date_str = "2026/05/06 18:45:12"
# 文字列の形式に合わせて書式を指定
date_obj = datetime.strptime(date_str, "%Y/%m/%d %H:%M:%S")
print(date_obj)
print(type(date_obj))
2026-05-06 18:45:12
<class 'datetime.datetime'>
解析時の注意点とエラーハンドリング
strptimeを使用する際に最も多いトラブルは、文字列の形式と書式指定コードが完全に一致していないことによるエラーです。
もし指定した書式と実際の文字列が1文字でも異なっている場合(例えば、スラッシュとハイフンの違い、不要なスペースの有無など)、PythonはValueErrorをスローします。
from datetime import datetime
bad_str = "2026-05-06"
try:
# 実際はハイフンだが、書式にスラッシュを指定した場合
obj = datetime.strptime(bad_str, "%Y/%m/%d")
except ValueError as e:
print(f"エラーが発生しました: {e}")
エラーが発生しました: time data '2026-05-06' does not match format '%Y/%m/%d'
実務では、入力データに不備がある可能性を考慮し、上記のようにtry-exceptブロックで囲むのが安全な設計と言えます。
実践的な変換シナリオ
ここでは、開発現場でよく遭遇する具体的な変換シナリオをいくつか紹介します。
1. ISO 8601 形式の扱い
システム間の連携やAPI通信では、ISO 8601形式(例: 2026-05-06T15:00:00Z)が頻繁に使われます。
strftimeでも作成可能ですが、Python 3.7以降であれば、より便利な専用メソッドが利用可能です。
from datetime import datetime
now = datetime.now()
# isoformatメソッドによる出力
iso_str = now.isoformat()
print(f"ISO形式: {iso_str}")
# isoformat文字列からの復元
parsed_obj = datetime.fromisoformat(iso_str)
print(f"復元オブジェクト: {parsed_obj}")
ISO形式: 2026-05-06T14:30:15.123456
復元オブジェクト: 2026-05-06 14:30:15.123456
特定の固定フォーマットであれば、strptimeで細かく書式を書くよりも、これらの専用メソッドを使うほうが可読性が高く、バグも少なくなります。
2. 曜日を日本語で表示する
strftimeの%Aなどは実行環境のロケール設定に依存します。
日本語の曜日(月、火、水…)を確実に出力したい場合は、リストや辞書を活用するのが最も汎用的で安全な方法です。
from datetime import datetime
now = datetime(2026, 5, 6) # 2026-05-06は水曜日
wdays = ["月", "火", "水", "木", "金", "土", "日"]
# weekday()メソッドは月曜が0, 日曜が6を返す
w_idx = now.weekday()
w_str = wdays[w_idx]
print(f"今日は{now.strftime('%Y年%m月%d日')}({w_str})です。")
今日は2026年05月06日(水)です。
3. マイクロ秒やタイムゾーンを含む変換
ログ解析などでは、より詳細な時間情報が必要になります。
from datetime import datetime, timezone, timedelta
# タイムゾーン(JST)付きのオブジェクト
jst = timezone(timedelta(hours=+9), 'JST')
dt = datetime(2026, 5, 6, 10, 20, 30, 500, tzinfo=jst)
# %fはマイクロ秒、%zはタイムゾーンのオフセット
log_format = "%Y/%m/%d %H:%M:%S.%f %z"
print(dt.strftime(log_format))
2026/05/06 10:20:30.000500 +0900
変換時によくある疑問と解決策
0埋めを解除したい場合
Windows環境とUNIX系環境(Linux/macOS)で動作が異なりますが、標準のstrftimeは基本的に0埋めを行います。
プラットフォームに依存せず0埋めを排除したい場合は、一度strftimeで文字列にしてから、数値としてパースし直すか、文字列操作を行うのが確実です。
あるいは、以下のような工夫が可能です。
# 日の0埋めをなくしたい場合 (例: 06日 -> 6日)
formatted = now.strftime("%m月%d日").replace(" 0", " ").replace("0", "")
# ※ただし、これは10月などが「1月」になってしまうリスクがあるため注意が必要
より洗練された方法としては、f-strings(フォーマット済み文字列リテラル)の中で日付オブジェクトを直接扱う方法があります。
from datetime import datetime
now = datetime(2026, 5, 6)
# f-strings内でもstrftimeと同じ書式が使える
print(f"日付: {now:%Y/%m/%d}")
パフォーマンスへの影響
大量のデータを処理する際、ループ内で何度もstrptimeを呼び出すと、処理速度がボトルネックになることがあります。
数万件以上の変換が必要な場合は、pandasライブラリのto_datetime関数などを検討すると、ベクトル演算により劇的に高速化できる場合があります。
まとめ
Pythonにおける日付と文字列の変換は、strftimeとstrptimeを使い分けることが基本です。
- strftime (String From Time):日付オブジェクトから「文字列」を作成する。
- strptime (String Parse Time):文字列を解析して「日付オブジェクト」に変換する。
これらを使用する際は、%Y(年)、%m(月)、%d(日)などの書式指定コードを正確に指定することが重要です。
特に、大文字の%M(分)と小文字の%m(月)の間違いは非常に多いため、コードを書くたびに意識する癖をつけると良いでしょう。
2026年現在の開発においても、日付処理は不変の重要スキルです。
標準のdatetimeモジュールをマスターすることで、複雑なデータ処理やユーザーフレンドリーな表示機能をスムーズに実装できるようになります。
ぜひ、お手元のコードでさまざまな書式指定を試してみてください。
