6.

【Pythonエラー】can only concatenate str (not "datetime.datetime") to str

編集
この記事の要点
  • can only concatenate str (not "datetime.datetime") to strdatetime オブジェクトを文字列と連結したエラー
  • 対処 ①: str(dt) または dt.strftime("%Y-%m-%d")
  • 対処 ②: f"{dt}"f"{dt:%Y-%m-%d}" (f-string)
  • 対処 ③: ISO 形式は dt.isoformat()
  • 逆 (文字列 → datetime): datetime.strptime(str, format)

 

エラーの状況

from datetime import datetime

dt = datetime.now()
print("Now: " + dt)
# TypeError: can only concatenate str (not "datetime.datetime") to str

# 同じく
log = "Event at " + dt
# 同じエラー

対処方法

方法 1: str() で変換

from datetime import datetime

dt = datetime.now()
print("Now: " + str(dt))
# → "Now: 2026-05-15 12:34:56.789012"

方法 2: strftime() でフォーマット指定

dt = datetime.now()

# 日付のみ
print("Date: " + dt.strftime("%Y-%m-%d"))
# → "Date: 2026-05-15"

# 時刻まで
print("Time: " + dt.strftime("%Y-%m-%d %H:%M:%S"))
# → "Time: 2026-05-15 12:34:56"

# 日本語
print(dt.strftime("%Y年%m月%d日 %H時%M分"))
# → "2026年05月15日 12時34分"

# 曜日
print(dt.strftime("%A"))  # → "Friday"
print(dt.strftime("%a"))  # → "Fri"

# ロケール対応
import locale
locale.setlocale(locale.LC_ALL, "ja_JP.UTF-8")
print(dt.strftime("%a"))  # → "金"

方法 3: f-string(推奨)

dt = datetime.now()

# 標準
print(f"Now: {dt}")
# → "Now: 2026-05-15 12:34:56.789012"

# フォーマット指定
print(f"Date: {dt:%Y-%m-%d}")
print(f"Time: {dt:%H:%M:%S}")
print(f"Both: {dt:%Y-%m-%d %H:%M:%S}")

# 配列と組み合わせ
events = [(datetime.now(), "Event A"), (datetime.now(), "Event B")]
for ts, msg in events:
    print(f"[{ts:%Y-%m-%d %H:%M}] {msg}")

方法 4: isoformat() (ISO 8601 標準)

dt = datetime.now()
print(dt.isoformat())
# → "2026-05-15T12:34:56.789012"

# タイムゾーン付き
from datetime import timezone
dt = datetime.now(timezone.utc)
print(dt.isoformat())
# → "2026-05-15T03:34:56.789012+00:00"

# 区切り文字変更
print(dt.isoformat(sep=" "))
# → "2026-05-15 03:34:56.789012+00:00"

# マイクロ秒を切り捨て
print(dt.isoformat(timespec="seconds"))
# → "2026-05-15T03:34:56+00:00"

strftime のフォーマット指示子

指示子意味
%Y年 (4 桁)2026
%y年 (2 桁)26
%m月 (01-12)05
%d日 (01-31)15
%H時 (24h, 00-23)12
%I時 (12h, 01-12)12
%M34
%S56
%fマイクロ秒789012
%A曜日 (フル)Friday
%a曜日 (略)Fri
%B月名 (フル)May
%b月名 (略)May
%pAM/PMPM
%Zタイムゾーン名JST
%zタイムゾーンオフセット+0900
%j年間通日135

逆方向: 文字列 → datetime

from datetime import datetime

# strptime (parse time)
dt = datetime.strptime("2026-05-15", "%Y-%m-%d")
print(dt)
# → 2026-05-15 00:00:00

dt = datetime.strptime("2026/05/15 12:34:56", "%Y/%m/%d %H:%M:%S")
print(dt)
# → 2026-05-15 12:34:56

# ISO 形式は fromisoformat (Python 3.7+)
dt = datetime.fromisoformat("2026-05-15T12:34:56")
print(dt)

# Python 3.11+ で柔軟になった
dt = datetime.fromisoformat("2026-05-15T12:34:56+09:00")  # タイムゾーン付き OK

# Unix タイムスタンプ
dt = datetime.fromtimestamp(1684123456)
print(dt)
# → 2023-05-14 ...

タイムゾーン処理

from datetime import datetime, timezone, timedelta
from zoneinfo import ZoneInfo  # Python 3.9+

# UTC
dt_utc = datetime.now(timezone.utc)
print(dt_utc.isoformat())  # → "2026-05-15T03:34:56+00:00"

# JST
jst = ZoneInfo("Asia/Tokyo")
dt_jst = datetime.now(jst)
print(dt_jst.isoformat())  # → "2026-05-15T12:34:56+09:00"

# UTC → JST 変換
dt_utc = datetime.now(timezone.utc)
dt_jst = dt_utc.astimezone(jst)

# naive (タイムゾーンなし) → aware (タイムゾーン付き)
dt_naive = datetime(2026, 5, 15, 12, 34)
dt_aware = dt_naive.replace(tzinfo=jst)

# 古い pytz (Python 3.8 以前)
import pytz
jst = pytz.timezone("Asia/Tokyo")
dt = pytz.utc.localize(datetime.utcnow()).astimezone(jst)

類似エラー

エラー対処
can only concatenate str (not "datetime.datetime") to strこのページ (str() / strftime() / f-string)
can only concatenate str (not "int") to strstr(int_val)
can only concatenate str (not "NoneType") to strNone チェック
can only concatenate list (not "str") to listlist を str に変換 or [str] にする

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ModuleNotFoundError: No module named '~'; '~' is not a package
  2. pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available
  3. ...AppData/Local/Microsoft/WindowsApps/python: Permission denied
  4. 【pycharm】connecting to console が終わらない
  5. can only concatenate str (not "NoneType") to str
  6. can only concatenate str (not "datetime.datetime") to str