「締め切りまであと何日か、カレンダーを指で数えている…」「Pythonで日付を扱おうとしたら、文字列のまま計算できなくて困った」――そんな経験、ありますよね。

この記事では、Python標準ライブラリの datetime を使って、日付の作り方・曜日の出し方・日付の足し算と引き算・文字列からの変換までを一緒に見ていきましょう!

難易度:Python入門者向け(変数・for文・関数がなんとなくわかればOK)。インストールは不要で、Pythonが入っていればすぐに試せます😊

datetimeでできることをざっくり整理

calendar deadline
calendar deadline / Photo by Leeloo The First via Pexels

datetime モジュールには、よく使う「型」が3つあります。イメージとしては、カレンダーの1マス(date)、カレンダー+時計(datetime)、期間の長さ(timedelta)です。

型 表すもの 例
date 年・月・日 2026-10-20
datetime 年・月・日+時・分・秒 2026-10-20 14:30:00
timedelta 期間(〇日間・〇時間) 66 days

この3つの関係がわかると、ざっくりとした流れがつかめるはずです。

日付を作って、曜日と表示形式を変える

まずは日付と日時を作って、曜日を日本語で表示してみます。ここが重要です👇

  • weekday() は曜日を 月曜=0 ~ 日曜=6 の数字で返す
  • 数字を日本語にするには、曜日のリストにインデックスでアクセスする
  • strftime() で「2026年10月20日」のような好きな形の文字列にできる
from datetime import date, datetime

# 日付(年・月・日)だけを扱うのが date
release = date(2026, 10, 20)
print("日付:", release)
print("年:", release.year, "月:", release.month, "日:", release.day)

# weekday() は 月曜=0 ~ 日曜=6 の数字で返ってくる
youbi = ["月", "火", "水", "木", "金", "土", "日"]
print("曜日:", youbi[release.weekday()] + "曜日")

# 日時(時・分・秒まで)を扱うのが datetime
meeting = datetime(2026, 10, 20, 14, 30)
print("日時:", meeting)

# strftime で好きな形の文字列にする
print(meeting.strftime("%Y年%m月%d日 %H時%M分"))
print(meeting.strftime("%Y/%m/%d") + f"({youbi[meeting.weekday()]})")

実行するとこうなりました。

日付: 2026-10-20
年: 2026 月: 10 日: 20
曜日: 火曜日
日時: 2026-10-20 14:30:00
2026年10月20日 14時30分
2026/10/20(火)

%Y(4桁の年)、%m(月)、%d(日)、%H(時)、%M(分)は、よく使うのでセットで覚えておくと便利です。月と日は「10」「05」のように2桁(0埋め)で出ます。

サンプルでは結果が毎回同じになるよう日付を固定していますが、今日の日付がほしいときは date.today()、今の日時なら datetime.now() を使います。

日付の足し算・引き算で「残り日数」と「〇日後」を求める

次はいちばん便利なところです。日付どうしを引き算すると timedelta(期間) が返ってきて、日付に timedelta を足すと「〇日後の日付」になります。

ポイントをまとめるとこんな感じです👇

  • 締め切り - 今日 → timedelta。日数だけほしいときは .days
  • 今日 + timedelta(days=30) → 30日後の date。月末や年またぎも自動で計算してくれる
  • 締め切りが土日なら weekday() >= 5 で判定し、1日ずつ戻して金曜日に前倒し
from datetime import date, timedelta

youbi = ["月", "火", "水", "木", "金", "土", "日"]
today = date(2026, 10, 20)  # 実際に使うときは date.today()

# ① 日付どうしの引き算 → timedelta(期間)が返ってくる
deadline = date(2026, 12, 25)
left = deadline - today
print("残り:", left)
print("残り日数:", left.days, "日")

# ② 日付 + timedelta で「〇日後」を求める
for n in [7, 30, 100]:
    d = today + timedelta(days=n)
    print(f"{n}日後: {d}({youbi[d.weekday()]})")

# ③ 締め切りが土日なら、直前の金曜日に前倒しする
def adjust_to_weekday(d):
    while d.weekday() >= 5:  # 5=土, 6=日
        d -= timedelta(days=1)
    return d

for due in [date(2026, 11, 20), date(2026, 11, 21), date(2026, 11, 22)]:
    fixed = adjust_to_weekday(due)
    print(f"{due}({youbi[due.weekday()]})→ {fixed}({youbi[fixed.weekday()]})")
実行結果:残り日数・〇日後・土日の前倒し
実行結果:残り日数・〇日後・土日の前倒し

100日後が2027年にまたがっても、正しく「2027-01-28」になっています。「10月は31日まで、11月は30日まで…」と自分で考えなくていいのがうれしいですよね🚀

ちなみに print(left) だと「66 days, 0:00:00」と時間まで付いて表示されます。日数だけを使いたいときは left.days と覚えておきましょう。

文字列の日付を変換して並べ替える(つまずきポイントつき)

CSVやExcelから読み込んだ日付は、多くの場合ただの文字列です。文字列のままでは引き算ができないので、strptime() で日付型に変換します。

これ、実行せずに答えられますか? datetime(2026, 10, 20, 9, 0) < date(2026, 10, 21) は True と False のどちらになるでしょう?

from datetime import date, datetime

# CSVなどから読んだ「文字列」の日付
rows = ["2026/11/05,請求書A", "2026/10/31,請求書B", "2026/12/01,請求書C"]
today = date(2026, 10, 20)

tasks = []
for row in rows:
    text, name = row.split(",")
    # strptime で 文字列 → datetime に変換し、.date() で日付だけにする
    d = datetime.strptime(text, "%Y/%m/%d").date()
    tasks.append((d, name))

# 日付型にすると、正しく並べ替え・比較ができる
for d, name in sorted(tasks):
    print(f"{name}: {d} あと{(d - today).days}日")

# ⚠️ よくあるつまずき:date と datetime はそのまま比較できない
try:
    print(datetime(2026, 10, 20, 9, 0) < date(2026, 10, 21))
except TypeError as e:
    print("TypeError:", e)

# 形式が合わない文字列は ValueError になる
try:
    datetime.strptime("2026-11-05", "%Y/%m/%d")
except ValueError as e:
    print("ValueError:", e)
実行結果:文字列から変換して並べ替え・よくあるエラー
実行結果:文字列から変換して並べ替え・よくあるエラー

答えは「どちらでもなく、TypeError」でした⚠️ ここで押さえておきたいのは次の3つです。

  • strptime(文字列, 形式) の形式は、文字列と完全に一致させる(「/」と「-」が違うだけで ValueError)
  • 日付だけで比べたいなら、.date() で datetime を date にそろえてから比べる
  • 日付型にしておけば、sorted() で古い順に正しく並べ替えられる

エラーメッセージの「does not match format」は「形式が合っていません」という意味です。読み込むデータの形式を一度 print() して確かめるのが近道ですよ。

まとめ

  • datetime には date(日付)・datetime(日付+時刻)・timedelta(期間) の3つの型がある
  • weekday() は月曜=0。曜日のリストと組み合わせると日本語の曜日が出せる
  • strftime() で日付→文字列、strptime() で文字列→日付
  • 日付の引き算で残り日数(.days)、timedelta の足し算で〇日後がわかる。月末・年またぎも自動
  • date と datetime はそのまま比べられないので、.date() でそろえる

締め切りの管理や「〇日後」の計算は、毎日の作業でもよく出てきます。「むずかしそう」を「できそう」に変える第一歩として、ぜひ自分の予定の日付で試してみてください😊

より詳しい書式コードの一覧は、Python公式ドキュメント(datetime)で確認できます。

\ 読んだら、次は自分で作ってみよう /

筆者が運営する無料の入門コース「作って学ぶPythonプログラミング入門」では、こうした基本文法を、割り勘計算機・おみくじ・数当てゲームなどを作りながら身につけます。各章末の定着ドリル(全42問)で、自分の手で書く練習まで。最初の4レッスンは登録なしで読めます。

→ 無料の入門コース(全7章52レッスン)を見てみる

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る
実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。