用語比較
datetimeとtimedeltaの違い|日付同士の引き算が経過日数になる理由(Python3基礎)
date(2003, 12, 2) から date(1964, 7, 31) を引くと、結果は datetime.timedelta(days=14368) です。日付同士の引き算の結果は、日付ではなく、日数の差を表す別の型になります。
datetime(date)は「いつか」を表し、timedelta は「どれだけの差か」を表すと覚えると、演算の結果の型を切り分けられます。
このページは、Python公式チュートリアル10.8「日付と時刻」の記述と、Python 3.9.6での実行結果をもとに比べます。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
結論
datetime・date
datetimeモジュールのクラスで、日付や時刻そのもの(いつか)を表す。
timedelta
2つの日付や時刻の差(どれだけか)を表す。日付同士を引くと得られ、.days で日数を取り出せる。
見分け方
結果が datetime.date(...) の形なら日付、datetime.timedelta(...) の形なら差。
違いを表で確認
| 比較軸 | datetime・date | timedelta |
|---|---|---|
| 表すもの | date・datetime:日付や時刻そのもの。例:datetime.date(2003, 12, 2) | timedelta:日数・秒数などの差。例:datetime.timedelta(days=14368) |
| 日付同士の引き算 now - birthday の結果 | date・datetime:引かれる側・引く側として使う(now と birthday はどちらも date) | timedelta:結果として得られる。age = now - birthday の age が timedelta で、age.days は 14368 |
| 日付に足し算をするとき | date + date:TypeError になる(日付どうしは足せない) | date + timedelta:日付が得られる。birthday + timedelta(days=14368) は datetime.date(2003, 12, 2) |
| 日と時間をまたぐ差の表し方 | datetime:datetime(2003, 12, 2, 10) - datetime(2003, 12, 1, 8) の引き算に使う | timedelta:結果は timedelta(days=1, seconds=7200)。時間は秒に換算されて保持される |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
age = now - birthday の age が何の型か分からない人
公式チュートリアルの例では、date 同士の引き算で経過日数が求まります。age は date ではなく timedelta で、age.days で日数を取り出します。
日付に日数を足したい人
date に足せるのは timedelta です。date + timedelta(days=14368) は、日付を返します。
timedelta(days=1, hours=2) を表示して seconds=7200 と出て戸惑った人
timedelta は日と秒で保持します。1日と2時間は timedelta(days=1, seconds=7200) と表示され、total_seconds() は 93600.0 です。
具体例で使い分ける
例 1
公式チュートリアルの経過日数の例
birthday = dt.date(1964, 7, 31)、now = dt.date(2003, 12, 2) として、age = now - birthday を求めます(Python 3.9.6で実行)。
- now と birthday はどちらも datetime.date です。
- 引き算の結果 age は datetime.timedelta(days=14368) で、age.days は 14368 です。
結論: 日付同士の引き算の結果は、timedelta です。
例 2
timedelta を日付に足す
birthday に、上で得た経過日数の timedelta を足します。
- birthday + timedelta(days=14368) は datetime.date(2003, 12, 2) です。
- date + date は TypeError(unsupported operand type(s) for +)になります。
結論: 日付に足せるのは、日付ではなく timedelta です。
例 3
選択肢で見分ける場合
「2つの日付の差を表す」という文を、date か timedelta かで判断します。
- 「差」を表すのは timedelta です。
- date や datetime は「いつか」を表します。
結論: 「差・経過」とあれば timedelta、「日付・時刻」とあれば date・datetime です。
問題文から答えを選ぶ手順
- 1
問われているものを見る
「いつか」なら date・datetime、「どれだけか」なら timedelta です。
- 2
演算を見る
日付 - 日付 は timedelta、日付 + timedelta は日付です。
- 3
結果の表示を見る
datetime.timedelta(days=...) の形なら差、datetime.date(...) の形なら日付です。
試験での見分け方
- 1date・datetime は日付や時刻そのものを表す。
- 2timedelta は2つの日付や時刻の差を表し、日付同士の引き算で得られる。
- 3日付に足し引きできるのは timedelta で、日付どうしの足し算はできない。
誤答しやすい選択肢
日付同士の引き算の結果も日付だと考える
修正: 結果は timedelta です。age.days のように、日数を取り出して使います。
date + date で日付を進められると考える
修正: TypeError になります。進めるには date + timedelta(days=...) と書きます。
timedelta(days=1, hours=2) が hours を保持すると考える
修正: 日と秒で保持するため、timedelta(days=1, seconds=7200) と表示されます。
確認問題
Q1dt.date(2003, 12, 2) - dt.date(1964, 7, 31) の結果の型は?
答え: timedelta
日付同士の引き算の結果は、日数の差を表す timedelta です。.days は 14368 です。
Q2dt.date(1964, 7, 31) + dt.timedelta(days=14368) の結果は?
答え: datetime.date(2003, 12, 2)
date に timedelta を足すと、日付が得られます。
Q3dt.date(2003, 12, 2) + dt.date(2003, 12, 3) はどうなりますか?
答え: TypeError
日付どうしの足し算は定義されていないため、TypeError になります。
到達チェック
- date・datetime が「いつか」、timedelta が「差」だと言える
- 日付 - 日付 の結果が timedelta で、.days で日数を取り出せると言える
- 日付に足せるのが timedelta だと言える
関連ページで確認する
同じ資格で次に知りたいこと
- try文のelse節とfinally節の違い|実行される条件と例外の扱い(Python3基礎)
try文のelse節とfinally節の違いを、Python公式チュートリアル8章の記述とPython 3.9.6の実行結果で整理。例外なしなら else→finally、例外ありなら except→finally になる流れと、else節の例外はexceptで捕捉されない点を、判断手順と確認問題つきで確認します。
- rangeとlistの違い|リストに見えて実はリストではない(Python3基礎)
rangeとlistの違いを、Python公式チュートリアル4.3の記述(rangeはリストのように振る舞うが本当はリストではない)とPython 3.9.6の実行結果で整理。printの表示、要素の変更、list()で変える場面を切り分ける判断手順と確認問題つき。
- setとfrozensetの違い|あとから変更できるか、辞書のキーにできるか(Python3基礎)
setとfrozensetの違いを、Python公式ドキュメントの記述(setは変更可能でハッシュ値を持たない、frozensetは変更不可でハッシュ可能)とPython 3.9.6の実行結果で整理。辞書のキーにできるか、addが使えるかを切り分ける判断手順と確認問題つき。
よくある質問
Qdatetimeとtimedeltaの違いは?
date・datetime は日付や時刻そのものを表し、timedelta は2つの日付や時刻の差を表します。日付同士を引くと timedelta が得られます。
Q日付同士の引き算の結果から日数を取り出すには?
timedelta の .days を使います。公式チュートリアルの例では、age = now - birthday の age.days が 14368 です。
Q日付に日数を足すには?
timedelta を足します。dt.date(1964, 7, 31) + dt.timedelta(days=14368) は datetime.date(2003, 12, 2) です。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
