Python datetime 文字列変換ツール
strftime・strptime を使った日付・時刻と文字列の相互変換を、書式コード付きでリアルタイムに体験できます
変換ツール インタラクティブ
日付文字列と書式コードを入力すると、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で使用できる書式コードの完全一覧です。ヘッダーをクリックしてコードを直接ツールに反映できます。
| コード | 意味 | 出力例 | 備考 |
|---|---|---|---|
%Y | 4桁の西暦年 | 2025 | ゼロ埋めあり |
%y | 2桁の西暦年 | 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 | 左ゼロ埋め |
%p | AM / PM | AM, 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, 53 | ISO週と異なる |
%V | ISO 8601週番号(01〜53) | 01, 53 | Python 3.6+ |
%z | UTCオフセット(±HHMM) | +0900 | awareオブジェクトのみ |
%Z | タイムゾーン名 | JST, UTC | awareオブジェクトのみ |
%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)の手順
from datetime import datetimeでdatetimeクラスをインポートする- 変換したい文字列と、その文字列に対応する書式コードを用意する
datetime.strptime(文字列, 書式コード)を呼び出す- 戻り値は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)の手順
from datetime import datetimeでdatetimeクラスをインポートする- datetimeオブジェクトを用意する(
datetime.now()やdatetime()コンストラクタなど) - datetimeオブジェクトに対して
.strftime(書式コード)を呼び出す - 戻り値は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)年です。サードパーティライブラリの
jpdatetimeやjpholidayも和暦処理に利用できます。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 |
