Pythonでプログラムを書いていると、日付や時刻を文字列として扱いたい場面が頻繁に訪れます。ログファイルのタイムスタンプ、レポートの日付表示、データベースへの保存など、datetimeオブジェクトを文字列に変換する操作はPythonプログラミングの重要なスキルのひとつです。
Pythonのdatetimeモジュールには、日付・時刻を文字列に変換するstrftime()や、逆に文字列からdatetimeオブジェクトを生成するstrptime()など、便利なメソッドが揃っています。フォーマット指定子を使いこなすことで、様々な形式の日付文字列を自在に生成できます。
この記事では、PythonのdatetimeをRを文字列に変換する方法を、strftimeの使い方やフォーマット指定子の一覧、strptimeによる逆変換まで、サンプルコードとともにわかりやすく解説していきます。
Pythonのdatetimeを文字列に変換するにはstrftime()を使うのが基本
それではまず、Pythonのdatetimeオブジェクトを文字列に変換する基本的な方法について解説していきます。
datetimeオブジェクトを文字列に変換するには、strftime()メソッドにフォーマット文字列を渡すのが基本です。「strftime」は「string format time」の略で、指定したフォーマットで日付・時刻を文字列として返してくれます。
from datetime import datetime
# 現在日時を取得してから文字列に変換
now = datetime.now()
result = now.strftime("%Y-%m-%d %H:%M:%S")
print(result)
# 日本語形式で変換
result_jp = now.strftime("%Y年%m月%d日 %H時%M分%S秒")
print(result_jp)
# 出力結果:2026-02-20 14:30:45
# 出力結果:2026年02月20日 14時30分45秒
strftime()の引数に渡すフォーマット文字列の中で、%Y・%m・%dなどのフォーマット指定子と呼ばれる特殊な記号を使って、年・月・日・時・分・秒をどの形式で出力するかを指定します。
よく使うフォーマット指定子一覧
strftime()で使えるフォーマット指定子の中で、特によく使われるものをまとめました。
| 指定子 | 内容 | 出力例 |
|---|---|---|
| %Y | 4桁の西暦年 | 2026 |
| %y | 2桁の西暦年 | 26 |
| %m | 2桁の月(ゼロ埋め) | 02 |
| %d | 2桁の日(ゼロ埋め) | 20 |
| %H | 24時間制の時(ゼロ埋め) | 14 |
| %I | 12時間制の時(ゼロ埋め) | 02 |
| %M | 2桁の分(ゼロ埋め) | 30 |
| %S | 2桁の秒(ゼロ埋め) | 45 |
| %A | 曜日(英語フル) | Friday |
| %p | AM/PM | PM |
様々な日付フォーマットへの変換例
実際の開発でよく使われる日付フォーマットへの変換例を確認しておきましょう。
from datetime import datetime
dt = datetime(2026, 2, 20, 14, 30, 45)
# よく使われるフォーマット
print(dt.strftime("%Y/%m/%d")) # スラッシュ区切り
print(dt.strftime("%Y-%m-%d")) # ハイフン区切り(ISO形式)
print(dt.strftime("%d/%m/%Y")) # 日/月/年
print(dt.strftime("%Y%m%d")) # 区切りなし
print(dt.strftime("%Y年%m月%d日(%A)")) # 日本語+曜日
# 出力結果:2026/02/20
# 出力結果:2026-02-20
# 出力結果:20/02/2026
# 出力結果:20260220
# 出力結果:2026年02月20日(Friday)
フォーマット文字列の区切り記号や順番を変えるだけで、様々な形式の日付文字列を生成できます。用途に合わせて使い分けましょう。
時刻のみ・日付のみを文字列に変換する
from datetime import datetime
dt = datetime(2026, 2, 20, 14, 30, 45)
# 日付のみ
date_str = dt.strftime("%Y-%m-%d")
print(f"日付:{date_str}")
# 時刻のみ
time_str = dt.strftime("%H:%M:%S")
print(f"時刻:{time_str}")
# 12時間制
time_12 = dt.strftime("%I:%M %p")
print(f"12時間制:{time_12}")
# 出力結果:日付:2026-02-20
# 出力結果:時刻:14:30:45
# 出力結果:12時間制:02:30 PM
必要な情報だけを抽出してフォーマットすることも自由にできます。ログの日付部分だけ、またはタイムスタンプの時刻部分だけを取り出したい場合などに活用しましょう。
str()とisoformat()でdatetimeを文字列化する方法
続いては、strftime()以外のdatetimeを文字列に変換する方法を確認していきます。
strftime()はフォーマットを自分で指定する方法ですが、str()やisoformat()を使うとデフォルトのフォーマットで素早く文字列化できます。用途によってはこちらの方がシンプルに書けます。
str()でdatetimeを文字列に変換する
from datetime import datetime
dt = datetime(2026, 2, 20, 14, 30, 45)
# str()で文字列に変換
result = str(dt)
print(result)
print(type(result))
# 出力結果:2026-02-20 14:30:45
# 出力結果:<class 'str'>
str()を使うと「YYYY-MM-DD HH:MM:SS」形式のデフォルト文字列が得られます。フォーマットの細かい指定が不要な場合はstr()が最もシンプルな選択肢です。
isoformat()でISO 8601形式に変換する
from datetime import datetime, timezone
dt = datetime(2026, 2, 20, 14, 30, 45)
# isoformat()でISO 8601形式に変換
print(dt.isoformat())
# タイムゾーン付き
dt_tz = datetime(2026, 2, 20, 14, 30, 45, tzinfo=timezone.utc)
print(dt_tz.isoformat())
# 区切り文字を変更
print(dt.isoformat(sep=" "))
# 出力結果:2026-02-20T14:30:45
# 出力結果:2026-02-20T14:30:45+00:00
# 出力結果:2026-02-20 14:30:45
isoformat()はAPIのリクエスト・レスポンスやJSONデータのタイムスタンプなど、国際標準のISO 8601形式が求められる場面でよく使われます。
f文字列とstrftimeを組み合わせる
from datetime import datetime
now = datetime.now()
# f文字列と組み合わせてメッセージに埋め込む
message = f"レポート生成日時:{now.strftime('%Y年%m月%d日 %H:%M')}"
print(message)
filename = f"report_{now.strftime('%Y%m%d_%H%M%S')}.txt"
print(filename)
# 出力結果:レポート生成日時:2026年02月20日 14:30
# 出力結果:report_20260220_143045.txt
f文字列の{}の中でstrftime()を直接呼び出すことができます。ファイル名にタイムスタンプを付与する処理など、実務でよく見かけるパターンです。
strptimeで文字列をdatetimeに変換する方法
続いては、strptimeを使って文字列からdatetimeオブジェクトに変換する方法を確認していきます。
strftimeが「datetime → 文字列」なのに対し、strptimeは「文字列 → datetime」への逆変換を行うクラスメソッドです。外部ファイルやAPIから取得した日付文字列を処理したい場面で欠かせません。
strptimeの基本的な使い方
from datetime import datetime
# 文字列をdatetimeに変換
date_str = "2026-02-20"
dt = datetime.strptime(date_str, "%Y-%m-%d")
print(dt)
print(type(dt))
# 日時の文字列も変換できる
datetime_str = "2026/02/20 14:30:45"
dt2 = datetime.strptime(datetime_str, "%Y/%m/%d %H:%M:%S")
print(dt2)
# 出力結果:2026-02-20 00:00:00
# 出力結果:<class 'datetime.datetime'>
# 出力結果:2026-02-20 14:30:45
strptime()の第1引数に変換したい文字列、第2引数にその文字列のフォーマットを指定します。フォーマットが文字列と一致していないとValueErrorが発生するため、文字列の形式に合わせたフォーマット指定が大切です。
様々な形式の日付文字列を変換する
from datetime import datetime
# 様々な形式からdatetimeに変換
formats = [
("20260220", "%Y%m%d"),
("2026年02月20日", "%Y年%m月%d日"),
("20-Feb-2026", "%d-%b-%Y"),
("02/20/2026 2:30 PM", "%m/%d/%Y %I:%M %p"),
]
for date_str, fmt in formats:
dt = datetime.strptime(date_str, fmt)
print(f"{date_str} → {dt.strftime('%Y-%m-%d %H:%M')}")
# 出力結果:20260220 → 2026-02-20 00:00
# 出力結果:2026年02月20日 → 2026-02-20 00:00
# 出力結果:20-Feb-2026 → 2026-02-20 00:00
# 出力結果:02/20/2026 2:30 PM → 2026-02-20 14:30
外部データの日付形式に合わせてフォーマットを指定することで、どんな形式の日付文字列でもdatetimeオブジェクトに変換できます。
strptimeのエラー対処法
from datetime import datetime
# 安全にstrptimeを使う
def safe_strptime(date_str, fmt):
try:
return datetime.strptime(date_str, fmt)
except ValueError as e:
print(f"変換エラー:{e}")
return None
result1 = safe_strptime("2026-02-20", "%Y-%m-%d")
result2 = safe_strptime("20260220", "%Y-%m-%d") # フォーマット不一致
print(result1)
print(result2)
# 出力結果:2026-02-20 00:00:00
# 出力結果:変換エラー:time data '20260220' does not match format '%Y-%m-%d'
# 出力結果:None
strptimeはフォーマット不一致でValueErrorを発生させるため、try-exceptで囲んで安全に処理するのがおすすめです。
datetimeと文字列変換の応用パターン
続いては、datetimeと文字列変換を組み合わせた実践的な応用パターンを確認していきます。
日付変換の知識を活かすと、ログのタイムスタンプ生成・日付計算・ファイル名への日付埋め込みなど、実務に直結する処理が実現できます。
日付の差分を計算して文字列に変換する
from datetime import datetime
# 2つの日付の差分を計算
start_str = "2026-01-01"
end_str = "2026-02-20"
start = datetime.strptime(start_str, "%Y-%m-%d")
end = datetime.strptime(end_str, "%Y-%m-%d")
diff = end - start
print(f"開始日:{start.strftime('%Y年%m月%d日')}")
print(f"終了日:{end.strftime('%Y年%m月%d日')}")
print(f"経過日数:{diff.days}日")
# 出力結果:開始日:2026年01月01日
# 出力結果:終了日:2026年02月20日
# 出力結果:経過日数:50日
strptimeで文字列をdatetimeに変換してから差分を計算し、再びstrftimeで文字列に戻す一連の流れは、日付処理の定番パターンです。
タイムスタンプ付きログメッセージを生成する
from datetime import datetime
def log(message, level="INFO"):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] [{level}] {message}")
log("サーモンのデータを読み込みました。")
log("ドラゴンフルーツの在庫が不足しています。", level="WARNING")
log("ゴリラのデータ処理に失敗しました。", level="ERROR")
# 出力結果:[2026-02-20 14:30:45] [INFO] サーモンのデータを読み込みました。
# 出力結果:[2026-02-20 14:30:45] [WARNING] ドラゴンフルーツの在庫が不足しています。
# 出力結果:[2026-02-20 14:30:45] [ERROR] ゴリラのデータ処理に失敗しました。
strftimeを使ったシンプルなログ関数の例です。タイムスタンプ付きのログ出力は実務のスクリプトで非常によく使われるパターンといえるでしょう。
日付をファイル名に使う
from datetime import datetime
# 日付をファイル名に埋め込む
now = datetime.now()
report_file = f"report_{now.strftime('%Y%m%d')}.csv"
backup_file = f"backup_{now.strftime('%Y%m%d_%H%M%S')}.zip"
log_file = f"log_{now.strftime('%Y-%m')}.txt"
print(report_file)
print(backup_file)
print(log_file)
# 出力結果:report_20260220.csv
# 出力結果:backup_20260220_143045.zip
# 出力結果:log_2026-02.txt
ファイル名に日付を含めることで、バックアップファイルやレポートファイルの管理が容易になります。日付部分のフォーマットは用途に合わせて調整しましょう。
まとめ
この記事では、Pythonのdatetimeを文字列に変換する方法について、strftimeの基本・フォーマット指定子・strptimeによる逆変換・応用パターンまで幅広く解説しました。
datetimeを文字列に変換するにはstrftime()にフォーマット文字列を渡すのが基本です。%Y・%m・%d・%H・%M・%Sなどのフォーマット指定子を組み合わせることで、様々な形式の日付文字列を生成できます。逆に文字列からdatetimeに変換したい場合はstrptime()を使い、文字列のフォーマットに合わせた指定子を渡しましょう。
ログのタイムスタンプ生成、ファイル名への日付埋め込み、日付差分の計算など、今回紹介したパターンは実務でそのまま活用できるものばかりです。ぜひコードに取り入れて試してみてください。