Pythonのdatetime入門!締め切りまでの残り日数・曜日・〇日後を計算する方法
「締め切りまであと何日か、カレンダーを指で数えている…」「Pythonで日付を扱おうとしたら、文字列のまま計算できなくて困った」――そんな経験、ありますよね。
この記事では、Python標準ライブラリの datetime を使って、日付の作り方・曜日の出し方・日付の足し算と引き算・文字列からの変換までを一緒に見ていきましょう!
難易度:Python入門者向け(変数・for文・関数がなんとなくわかればOK)。インストールは不要で、Pythonが入っていればすぐに試せます😊
datetimeでできることをざっくり整理

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レッスンは登録なしで読めます。
こちらも読まれています
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。




