中学英語808712 views
LaTeX957300 views
高校国語785655 views
世界の国560595 views
小学算数1194618 views
高校倫理1433119 views
雑学1472593 views
中学数学621382 views
英語607877 views
中学理科1626207 views
Help
Tools

English

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"))

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