Pythonの型不一致エラー「can only concatenate〜」の対処方法についてまとめた記事です。
「can only concatenate」が発生するケースと対処方法について説明します。

「can only concatenate」(型不一致)とは?

「can only concatenate〜」は型不一致の場合に起きるエラーです。
プログラミングでは計算をする場合、計算に使う全ての値の型を揃える必要がありますが、一つでも違う型の値がある場合は「can only concatenate〜」となります。
型の使い方を理解していない初心者の頃はよく見るエラーです。
ちなみにイージーミスの多い私の場合は最近でもちょくちょく見ます(笑)。
「can only concatenate〜」が起きるのは以下のような場合です。
◆プログラム概要
現在時刻を以下のフォーマットで表示したい。

日時:〇〇

※”日時:”は文字列。〇〇には現在時刻が入ります。

import datetime
# 現在時刻の取得
now = datetime.datetime.now()
# 文字列変数の定義
label = '日時:'
print(label + now)

◆実行結果

Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "datetime.datetime") to str

上記例では、文字列とdatetime型の変数を加算しようとしたため型不一致のためエラーとなっています。

「can only concatenate」の対処方法

「can only concatenate〜」の対処方法は以下の通り。
・型を揃える
・キャストする

型を揃える

基本的に計算をする場合は型を揃えておくのがベストです。
キャストすると意図しない計算結果になる可能性が高くなります。
実装例は以下の通り。
now_strに文字列に変換した時刻を取得します。

import datetime
# 現在時刻の取得
now = datetime.datetime.now()
# 文字列型に変換
now_str = now.strftime('%Y/%m/%d %H:%M:%S')
# 文字列変数の定義
label = '日時:'
print(label + now_str)

◆実行結果

日時:2019/11/22 16:07:48

キャストする

キャストとは強制的に型を書き換える方法です。
例えば文字列型にキャストしたい場合は以下のように記述します。

now_str = str(now)

その他整数型に書き換えるint()などがあります。
強引に型を書き換える方法なので意図しない動きになるケースも多いです。
テストをしっかりと行ってエラーが起きないように注意しましょう。

時刻と文字列

時刻を文字列に寄せる場合の実装例は以下の通り。

import datetime
# 現在時刻の取得
now = datetime.datetime.now()
# 文字列変数の定義
label = '日時:'
print(label + str(now))

◆実行結果

日時:2019-11-22 16:21:07.429220

キャストと計算

キャストによって数字の計算をしたい場合はint型に寄せる必要があります。
◆文字列に寄せる場合

a = 1
b = "2"
print(str(a) + b)

◆実行結果
’12’
◆整数に寄せる場合

a = 1
b = "2"
print(a + int(b))

◆実行結果
3
上記のように文字列(str型)に寄せると計算せずにそのままくっつき、整数(int型)に寄せると計算ができます。
ちなみに時刻型の計算をしたい場合は、timedeltaを使用します。

import datetime
datetime.timedelta(hours=1)
now = datetime.datetime.now()
print(now + hour)

◆実行結果
2019-11-22 18:19:16.183098
datetime型の使い方については公式ドキュメントも熟読してください。
おすすめ記事Python入門者のための100日勉強方法
Pythonエラーの解決方法まとめ>>【初心者向け】Pythonのエラーを減らす方法・解決まとめ