こんにちは、かつコーチです。
「今日の日付を取得したい」「日付の文字列を、扱いやすい形式に変換したい」
そんなとき、Pythonでは標準ライブラリのdatetimeモジュールを使います。
「datetime.now()とdate.today()は何が違うの」
「文字列と日付を相互に変換する方法が分からない」
そう感じている方も多いと思います。
この記事では、datetime.now()の基本、strftime・strptimeによるフォーマット変換、そしてtimedeltaを使った日付計算までを解説します。
読み終える頃には、日付・時刻を扱う処理を、自信を持って書けるようになります。
datetime.now()の基本
現在の日時を取得する
datetimeモジュールのdatetimeクラスにあるnow()メソッドを使うと、現在の日時を取得できます。
from datetime import datetime
now = datetime.now()
print(now)
print(type(now))
実行結果は次のようになります(実行した日時によって値は変わります)。
2026-08-22 14:35:10.123456
<class 'datetime.datetime'>
now()の返り値は、datetimeという専用の型のオブジェクトです。
単なる文字列ではなく、年・月・日・時・分・秒などの情報を、それぞれ属性として持っています。
from datetime import datetime
now = datetime.now()
print(now.year)
print(now.month)
print(now.day)
print(now.hour)
print(now.minute)
実行結果は次のようになります。
2026
8
22
14
35
date.todayとの違い
日付だけが必要で、時刻の情報が不要な場合は、dateクラスのtoday()メソッドを使います。
from datetime import date, datetime
today = date.today()
now = datetime.now()
print(today)
print(now)
実行結果は次のようになります。
2026-08-22
2026-08-22 14:35:10.123456
date.today()は日付のみ、datetime.now()は日付と時刻の両方を持つ点が違いです。
「今日の日付だけ記録したい」場合はdate、「処理が実行された正確な時刻まで記録したい」場合はdatetime、というように使い分けます。
strftime・strptimeでのフォーマット変換
strftimeで日付をお好みの文字列に変換する
strftimeは、datetimeオブジェクトを、指定したフォーマットの文字列に変換するメソッドです。
from datetime import datetime
now = datetime.now()
formatted = now.strftime("%Y年%m月%d日 %H時%M分")
print(formatted)
実行結果は次のようになります。
2026年08月22日 14時35分
主なフォーマット指定子は次の通りです。
| 指定子 | 意味 | 例 |
|---|---|---|
%Y | 4桁の年 | 2026 |
%m | 2桁の月 | 08 |
%d | 2桁の日 | 22 |
%H | 24時間表記の時 | 14 |
%M | 分 | 35 |
%S | 秒 | 10 |
%A | 曜日(英語フル) | Saturday |
画面表示用に見やすい形式へ整えたいときは、このstrftimeをよく使います。
strptimeで文字列を日付に変換する
strptimeは、strftimeとは逆に、文字列をdatetimeオブジェクトに変換するメソッドです。
from datetime import datetime
date_string = "2026-08-22 14:35:00"
parsed = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(parsed)
print(type(parsed))
実行結果は次のようになります。
2026-08-22 14:35:00
<class 'datetime.datetime'>
strptimeの第2引数には、変換対象の文字列の形式に合わせたフォーマットを指定します。
CSVファイルやAPIのレスポンスなど、文字列として届いた日付データを、Pythonで扱いやすいdatetimeオブジェクトに変換する場面でよく使います。
timedeltaでの日付計算
timedeltaで日数・時間を加減算する
timedeltaは、日付や時刻の「差分」や「経過期間」を表すクラスです。
datetimeオブジェクトにtimedeltaを足し引きすることで、日付の計算ができます。
from datetime import datetime, timedelta
today = datetime.now()
three_days_later = today + timedelta(days=3)
one_week_ago = today - timedelta(weeks=1)
print(f"3日後: {three_days_later.strftime('%Y-%m-%d')}")
print(f"1週間前: {one_week_ago.strftime('%Y-%m-%d')}")
実行結果は次のようになります。
3日後: 2026-08-25
1週間前: 2026-08-15
timedeltaにはdays・weeks・hours・minutes・secondsなど、さまざまな単位を指定できます。
「支払い期限は7日後」「セッションの有効期限は30分後」といった、日付・時刻の計算を伴う処理で頻繁に使います。
2つの日付の差を求める
datetimeオブジェクト同士を引き算すると、timedeltaオブジェクトが得られます。
from datetime import datetime
start = datetime(2026, 1, 1)
end = datetime(2026, 8, 22)
diff = end - start
print(diff)
print(f"経過日数: {diff.days}日")
実行結果は次の通りです。
233 days, 0:00:00
経過日数: 233日
diff.daysのように、timedeltaオブジェクトから日数だけを取り出すこともできます。
会員登録日からの経過日数や、締切までの残り日数を計算するときに役立ちます。
よくあるつまずきポイント・エラー対処
strptimeでフォーマットが一致せずエラーになる
筆者がCSVから読み込んだ日付データを変換する処理を書いていたとき、フォーマット指定を1文字間違えてエラーに遭遇した経験があります。
❌ Before(フォーマットが実際の文字列と一致していない書き方)
from datetime import datetime
date_string = "2026/08/22"
parsed = datetime.strptime(date_string, "%Y-%m-%d")
print(parsed)
実行すると、次のエラーメッセージが表示されます。
ValueError: time data '2026/08/22' does not match format '%Y-%m-%d'
実際の文字列は/区切りの2026/08/22なのに、フォーマット指定では-区切りの%Y-%m-%dを指定してしまっているのが原因です。
strptimeは、指定したフォーマットと、実際の文字列の区切り文字や桁数が完全に一致していないと、エラーになります。
✅ After(実際の文字列に合わせたフォーマットの書き方)
from datetime import datetime
date_string = "2026/08/22"
parsed = datetime.strptime(date_string, "%Y/%m/%d")
print(parsed)
実行結果は次の通りです。
2026-08-22 00:00:00
フォーマット指定を、実際のデータの区切り文字(/)に合わせたことで、正しく変換できるようになりました。
外部から受け取る日付データをstrptimeで変換する際は、まず変換対象の文字列をprintなどで確認し、区切り文字や桁数を正確に把握してからフォーマットを指定するのが安全です。
まとめ
この記事のポイント
datetime.now()で日付と時刻、date.today()で日付のみを取得できるstrftimeは日付を文字列に、strptimeは文字列を日付に変換するメソッドであるtimedeltaを使うと、日付の加減算や2つの日付の差分を計算できるstrptimeはフォーマット指定と実際の文字列の形式が完全に一致していないとエラーになる- 外部データを変換する際は、まず元の文字列の形式を確認してからフォーマットを指定する
次に読むべき記事
- 文字列操作とf-stringの書き方
- 条件分岐(if文)の基本
- collections.Counterでデータを集計する
タグ: Python, 初心者向け, 標準ライブラリ