Python で文字列を datetime に変換する strptime の使い方
ログファイルや CSV、API のレスポンスなど、日時が文字列で渡されることは多いです。Python で文字列を datetime オブジェクトに変換するには strptime() を使います。
strptime の基本
strptime() は「string parse time」の略で、文字列を解析して datetime オブジェクトを生成します。
from datetime import datetime
date_string = "2025-01-15 10:30:00"
dt = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(dt) # 2025-01-15 10:30:00
print(type(dt)) # <class 'datetime.datetime'>
第1引数に変換したい文字列、第2引数に書式を指定します。書式が文字列と一致しないとエラーになるので、正確に合わせる必要があります。
よく使う書式指定子
書式指定子は strftime() と共通です。主要なものを覚えておきましょう。
| 指定子 | 意味 | 例 |
|---|---|---|
| %Y | 4桁の年 | 2025 |
| %m | 2桁の月 | 01〜12 |
| %d | 2桁の日 | 01〜31 |
時刻関連の指定子も見ておきます。
| 指定子 | 意味 | 例 |
|---|---|---|
| %H | 24時間表記の時 | 00〜23 |
| %M | 分 | 00〜59 |
| %S | 秒 | 00〜59 |
さまざまな形式に対応する
実際のデータはさまざまな形式で渡されます。いくつかのパターンを見てみましょう。
from datetime import datetime
# スラッシュ区切り
s1 = "2025/01/15"
dt1 = datetime.strptime(s1, "%Y/%m/%d")
print(dt1)
# 日本語表記
s2 = "2025年1月15日"
dt2 = datetime.strptime(s2, "%Y年%m月%d日")
print(dt2)
# 時刻付き(T区切り)
s3 = "2025-01-15T10:30:00"
dt3 = datetime.strptime(s3, "%Y-%m-%dT%H:%M:%S")
print(dt3)
書式文字列は、日時以外の部分(区切り文字や固定テキスト)もそのまま記述します。
0埋めされていない場合
月や日が0埋めされていない形式もあります。
from datetime import datetime
# 0埋めなし
s = "2025-1-5"
dt = datetime.strptime(s, "%Y-%m-%d")
print(dt) # 2025-01-05 00:00:00
%m や %d は0埋めなしの数字も受け付けます。ただし出力側の strftime() では常に0埋めされるため、この違いに注意してください。
エラーハンドリング
書式が一致しない場合は ValueError が発生します。ユーザー入力を扱う場合は例外処理を入れておくのが安全です。
from datetime import datetime
def parse_date(s):
try:
return datetime.strptime(s, "%Y-%m-%d")
except ValueError:
return None
result = parse_date("2025-01-15")
print(result) # 2025-01-15 00:00:00
result = parse_date("invalid")
print(result) # None
複数の形式を試したい場合は、リストでループさせる方法もあります。
from datetime import datetime
def parse_date_flexible(s):
formats = ["%Y-%m-%d", "%Y/%m/%d", "%d-%m-%Y"]
for fmt in formats:
try:
return datetime.strptime(s, fmt)
except ValueError:
continue
return None
print(parse_date_flexible("2025-01-15"))
print(parse_date_flexible("15-01-2025"))
外部データを扱う際は、想定外の形式が混入することもあるため、柔軟なパース処理を用意しておくと安心です。