Pythonでdatetimeと文字列を相互変換する完全ガイド

Python datetime 文字列変換ツール

strftime・strptime を使った日付・時刻と文字列の相互変換を、書式コード付きでリアルタイムに体験できます

変換ツール インタラクティブ
文字列 → datetime(strptime)
datetime → 文字列(strftime)
タイムスタンプ変換
和暦変換

日付文字列と書式コードを入力すると、Pythonコード例と解析結果をリアルタイムで表示します。

クイック入力:
Pythonコード例
解析結果(各要素)

日付・時刻を入力し、出力したい書式コードを選択または入力して変換します。

Pythonコード例
変換結果

Unixタイムスタンプ(エポック秒)とdatetimeを相互変換します。

Pythonコード例
変換結果

西暦年を和暦(令和・平成・昭和・大正・明治)に変換します。

変換結果
Pythonコード例
変換履歴(最近5件)
  • 履歴はまだありません
strftime と strptime の違い
strftime
  • 役割:datetimeオブジェクト → 文字列
  • 呼び出し:datetimeオブジェクトのメソッド
  • 引数:書式コード(format)のみ
  • 戻り値:str型
  • エラー:書式不正でTypeError
from datetime import datetime dt = datetime(2025, 1, 31, 9, 30) s = dt.strftime(“%Y/%m/%d”) # => ‘2025/01/31’
strptime
  • 役割:文字列 → datetimeオブジェクト
  • 呼び出し:datetimeクラスのクラスメソッド
  • 引数:文字列・書式コードの2つ
  • 戻り値:datetimeオブジェクト
  • エラー:書式不一致でValueError
from datetime import datetime dt = datetime.strptime( “2025/01/31”, “%Y/%m/%d” ) # => datetime(2025, 1, 31, 0, 0)
書式コード(ディレクティブ)一覧

strftime・strptimeで使用できる書式コードの完全一覧です。ヘッダーをクリックしてコードを直接ツールに反映できます。

コード 意味 出力例 備考
%Y4桁の西暦年2025ゼロ埋めあり
%y2桁の西暦年25世紀なし
%m月(01〜12)01, 12ゼロ埋めあり
%d日(01〜31)01, 31ゼロ埋めあり
%H時(00〜23、24時間制)00, 23ゼロ埋めあり
%I時(01〜12、12時間制)01, 12%pと組み合わせ
%M分(00〜59)00, 59ゼロ埋めあり
%S秒(00〜59)00, 59ゼロ埋めあり
%fマイクロ秒(000000〜999999)123456左ゼロ埋め
%pAM / PMAM, PMロケール依存
%A曜日フル名(英語)Mondayロケール依存
%a曜日略称(英語)Monロケール依存
%w曜日番号(0=日曜)0〜6日曜=0
%B月フル名(英語)Januaryロケール依存
%b月略称(英語)Janロケール依存
%j年通日(001〜366)001, 365元日=001
%U週番号(日曜始まり、00〜53)00, 53年初は週0
%W週番号(月曜始まり、00〜53)00, 53ISO週と異なる
%VISO 8601週番号(01〜53)01, 53Python 3.6+
%zUTCオフセット(±HHMM)+0900awareオブジェクトのみ
%Zタイムゾーン名JST, UTCawareオブジェクトのみ
%c日時の完全表現Fri Jan 31 09:30:00 2025ロケール依存
%x日付の表現01/31/25ロケール依存
%X時刻の表現09:30:00ロケール依存
%%リテラルの%記号%エスケープ
よく使う変換パターン
変換パターン 入力例 書式コード Pythonコード
ISO 8601形式 2025-01-31 %Y-%m-%d strptime(s, "%Y-%m-%d")
スラッシュ区切り(日本) 2025/01/31 %Y/%m/%d strptime(s, "%Y/%m/%d")
日本語日付 2025年1月31日 %Y年%m月%d日 strptime(s, "%Y年%m月%d日")
日本語日時 2025年1月31日 09時30分00秒 %Y年%m月%d日 %H時%M分%S秒 strptime(s, "%Y年%m月%d日 %H時%M分%S秒")
米国形式 01/31/2025 %m/%d/%Y strptime(s, "%m/%d/%Y")
欧州形式 31/01/2025 %d/%m/%Y strptime(s, "%d/%m/%Y")
英語月名・日・年 January 31, 2025 %B %d, %Y strptime(s, "%B %d, %Y")
英語月略称 31 Jan 2025 %d %b %Y strptime(s, "%d %b %Y")
日時(12時間制) 01/31/2025 09:30 AM %m/%d/%Y %I:%M %p strptime(s, "%m/%d/%Y %I:%M %p")
ISO 8601日時 2025-01-31T09:30:00 %Y-%m-%dT%H:%M:%S strptime(s, "%Y-%m-%dT%H:%M:%S")
ミリ秒付き 2025-01-31 09:30:00.123456 %Y-%m-%d %H:%M:%S.%f strptime(s, "%Y-%m-%d %H:%M:%S.%f")
区切りなし(ファイル名用) 20250131 %Y%m%d strptime(s, "%Y%m%d")
RFC 2822(メール) Fri, 31 Jan 2025 09:30:00 %a, %d %b %Y %H:%M:%S strptime(s, "%a, %d %b %Y %H:%M:%S")
タイムスタンプ → datetime 1706672400 datetime.fromtimestamp(ts)
datetime → タイムスタンプ datetime(2025,1,31,9,30) dt.timestamp()
変換ステップとサンプルコード

① 文字列 → datetime(strptime)の手順

  1. from datetime import datetime でdatetimeクラスをインポートする
  2. 変換したい文字列と、その文字列に対応する書式コードを用意する
  3. datetime.strptime(文字列, 書式コード) を呼び出す
  4. 戻り値はdatetimeオブジェクト(.year / .month / .day などでアクセス可能)
from datetime import datetime # 基本的なパース s = “2025/01/31 09:30:00” dt = datetime.strptime(s, “%Y/%m/%d %H:%M:%S”) # => datetime(2025, 1, 31, 9, 30, 0) # 各要素へのアクセス print(dt.year) # => 2025 print(dt.month) # => 1 print(dt.day) # => 31 print(dt.hour) # => 9 # 日本語日付のパース s2 = “2025年1月31日 09時30分00秒” dt2 = datetime.strptime(s2, “%Y年%m月%d日 %H時%M分%S秒”) # ISO 8601形式(T区切り) s3 = “2025-01-31T09:30:00” dt3 = datetime.strptime(s3, “%Y-%m-%dT%H:%M:%S”)

② datetime → 文字列(strftime)の手順

  1. from datetime import datetime でdatetimeクラスをインポートする
  2. datetimeオブジェクトを用意する(datetime.now()datetime()コンストラクタなど)
  3. datetimeオブジェクトに対して .strftime(書式コード) を呼び出す
  4. 戻り値はstr型の文字列
from datetime import datetime # 現在日時を取得 now = datetime.now() # 各種フォーマットへ変換 print(now.strftime(“%Y-%m-%d”)) # => ‘2025-01-31’ print(now.strftime(“%Y/%m/%d %H:%M:%S”)) # => ‘2025/01/31 09:30:00’ print(now.strftime(“%Y年%m月%d日”)) # => ‘2025年01月31日’ print(now.strftime(“%Y%m%d%H%M%S”)) # => ‘20250131093000’ # 特定日時を指定 dt = datetime(2025, 1, 31, 9, 30, 0) print(dt.strftime(“%B %d, %Y”)) # => ‘January 31, 2025’

③ タイムスタンプ・タイムゾーン変換

from datetime import datetime, timezone, timedelta # Unixタイムスタンプ → datetime(ローカル時刻) ts = 1706672400 dt_local = datetime.fromtimestamp(ts) # Unixタイムスタンプ → datetime(UTC) dt_utc = datetime.utcfromtimestamp(ts) # datetime → Unixタイムスタンプ now = datetime.now(timezone.utc) ts_now = now.timestamp() # UTC → JST(+9時間)への変換 JST = timezone(timedelta(hours=9)) dt_utc_aware = datetime.now(timezone.utc) dt_jst = dt_utc_aware.astimezone(JST) print(dt_jst.strftime(“%Y/%m/%d %H:%M:%S %Z”)) # => ‘2025/01/31 18:30:00 UTC+09:00’

④ 和暦変換の例

from datetime import datetime # 和暦文字列 → datetimeオブジェクト wareki_str = “令和06年01月31日” # 令和元年=2019年なので年を変換してからstrptimeを使う reiwa_year = 2018 # 令和X年 = 2018+X wareki_num = int(wareki_str[2:4]) seireki_year = reiwa_year + wareki_num seireki_str = str(seireki_year) + wareki_str[5:] dt = datetime.strptime(seireki_str, “%Y年%m月%d日”) # isoformat()で ISO 8601 形式の文字列に変換 dt2 = datetime(2025, 1, 31) print(dt2.isoformat()) # => ‘2025-01-31T00:00:00’
よくあるエラーと対処法
エラー 原因 対処法
ValueError: time data '...' does not match format '...' 文字列と書式コードが一致しない 文字列と書式を再確認。区切り文字の違い(/と-など)に注意
ValueError: unconverted data remains 書式コードが文字列より短い 文字列全体をカバーするよう書式コードを拡張する
TypeError: strptime() argument 1 must be str, not ... 第1引数が文字列型でない str()で文字列に変換してから渡す
AttributeError: 'str' object has no attribute 'strftime' strftimeを文字列に呼び出している 先にstrptimeでdatetimeに変換してからstrftimeを呼ぶ
出力が英語月名になる %B/%bはロケール依存で英語になる 日本語月名が必要な場合は手動マッピングを使う
タイムゾーンが変換されない naiveオブジェクト(tzinfo=None)を使用 timezone.utcやpytzで明示的にtzinfoを付与する
2桁年(%y)で誤認識 %yは00-68を2000-2068、69-99を1969-1999と解釈 4桁年(%Y)を使うことを推奨
よくある質問(FAQ)
strftime と strptime の名前の由来は?
「strftime」は “string format time“の略で、時刻をフォーマットして文字列化します。「strptime」は “string parse time“の略で、文字列を解析して時刻オブジェクトに変換します。どちらもC言語の同名関数に由来します。
書式コードを指定せずに文字列から日付に変換できますか?
はい、python-dateutilライブラリのdateutil.parser.parse()を使うと、書式コードを指定しなくても多くの形式を自動認識できます。ただし、曖昧な日付(例:01/02/03)は誤認識の可能性があるため、重要な処理ではstrptimeで書式を明示することを推奨します。インストールはpip install python-dateutilで行います。
datetime.date と datetime.datetime の違いは?
datetime.dateは日付のみ(年・月・日)を扱うクラスです。datetime.datetimeは日付と時刻の両方(年・月・日・時・分・秒・マイクロ秒)を扱うクラスで、datetimeクラスはdateクラスのサブクラスです。文字列変換(strftime/strptime)はどちらのクラスでも利用できます。
isoformat() と strftime(“%Y-%m-%dT%H:%M:%S”) の違いは?
isoformat()はISO 8601形式の文字列を返す専用メソッドで、マイクロ秒やタイムゾーン情報(tzinfo)も自動的に含めます。strftime()より簡潔に書けますが、出力形式のカスタマイズ性はstrftimeの方が高いです。逆変換(文字列→datetime)にはPython 3.7以降でdatetime.fromisoformat()が使えます。
タイムゾーン付き(aware)のdatetimeを文字列に変換するには?
awareなdatetimeオブジェクト(tzinfo属性を持つ)に対してstrftimeを呼び出すと、%z(UTCオフセット例:+0900)や%Z(タイムゾーン名)を書式コードに含めることができます。例:dt.strftime("%Y/%m/%d %H:%M:%S %z")"2025/01/31 09:30:00 +0900"。naiveなオブジェクトで%zを使うと空文字列になります。
和暦(令和・平成など)の文字列をdatetimeに変換するには?
Python標準のdatetimeモジュールは和暦に対応していないため、まず和暦年を西暦年に変換してからstrptimeを使います。令和はX年=西暦(2018+X)年、平成はX年=西暦(1988+X)年、昭和はX年=西暦(1925+X)年です。サードパーティライブラリのjpdatetimejpholidayも和暦処理に利用できます。
Pandasでdatetime型と文字列を変換するには?
Pandasではpd.to_datetime()でシリーズの文字列列をdatetime型に一括変換できます。書式コードをformat引数で指定することで高速化できます。逆にdatetime型を文字列にするにはdt.strftime()メソッドをシリーズに対して呼び出すか、.dt.strftime(format)アクセサを使います。
和暦・西暦対照表
元号 開始年(西暦) 終了年(西暦) 変換式(元号X年→西暦) Pythonコード例
令和(Reiwa) 2019年(令和元年) 現在 西暦 = 和暦年 + 2018 seireki = wareki + 2018
平成(Heisei) 1989年(平成元年) 2019年(平成31年) 西暦 = 和暦年 + 1988 seireki = wareki + 1988
昭和(Showa) 1926年(昭和元年) 1989年(昭和64年) 西暦 = 和暦年 + 1925 seireki = wareki + 1925
大正(Taisho) 1912年(大正元年) 1926年(大正15年) 西暦 = 和暦年 + 1911 seireki = wareki + 1911
明治(Meiji) 1868年(明治元年) 1912年(明治45年) 西暦 = 和暦年 + 1867 seireki = wareki + 1867