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() と共通です。主要なものを覚えておきましょう。

指定子意味
%Y4桁の年2025
%m2桁の月01〜12
%d2桁の日01〜31

時刻関連の指定子も見ておきます。

指定子意味
%H24時間表記の時00〜23
%M00〜59
%S00〜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"))

外部データを扱う際は、想定外の形式が混入することもあるため、柔軟なパース処理を用意しておくと安心です。