Python入門 第13回:日付と時間

Python入門 第13回:日付と時間 Python

はじめに

Pythonでプログラムを作成していると、日付や時間を扱う場面がよくあります。

例えば、次のような処理です。

  • 現在の日付と時刻を取得する
  • 今日の日付を画面に表示する
  • ファイル名に日時を追加する
  • ログに処理時刻を記録する
  • 指定した日付までの日数を計算する
  • 1週間後や3日前の日付を求める

Pythonでは、日付や時間を扱うためにdatetimeモジュールが用意されています。

今回は、datetimeモジュールを使った基本的な日付と時間の操作について説明します。


datetimeモジュールとは

datetimeは、Pythonの標準ライブラリに含まれているモジュールです。

追加でインストールする必要はありません。

プログラムの先頭に次のように記述することで使用できます。

from datetime import datetime

datetimeという名前が2回登場しているため、最初は少し分かりにくいかもしれません。

from datetime import datetime

最初のdatetimeはモジュール名です。

2つ目のdatetimeは、モジュールの中に用意されている日時を扱うためのクラスです。

今回は、詳しい仕組みを覚える必要はありません。

「日付と時刻を扱うときに記述するもの」として覚えておきましょう。


現在の日付と時刻を取得する

現在の日付と時刻を取得するには、datetime.now()を使用します。

from datetime import datetime

print(datetime.now())

実行結果の例は次のとおりです。

2026-07-18 14:35:42.123456

実行するタイミングによって、表示される日時は変わります。

表示内容は、左から順番に次のようになっています。

年-月-日 時:分:秒.マイクロ秒

今回の例では、次の日時を表しています。

2026年7月18日 14時35分42秒

最後に表示されている.123456は、1秒よりも細かいマイクロ秒です。

通常のプログラムでは、マイクロ秒まで使用しないことも多いため、必要に応じて表示形式を変更します。


取得した日時を変数に代入する

datetime.now()で取得した日時は、変数に代入できます。

from datetime import datetime

now = datetime.now()

print(now)

実行結果の例は次のとおりです。

2026-07-18 14:35:42.123456

変数に代入しておくことで、取得した日時を複数の処理で使用できます。

from datetime import datetime

now = datetime.now()

print("現在の日時:", now)
print("年:", now.year)
print("月:", now.month)
print("日:", now.day)

実行結果の例は次のとおりです。

現在の日時: 2026-07-18 14:35:42.123456
年: 2026
月: 7
日: 18

年・月・日を個別に取得する

datetime型のデータから、年や月などを個別に取得できます。

主に使用する属性は次のとおりです。

属性取得できる値
year
month
day
hour
minute
second
microsecondマイクロ秒

実際に使用してみましょう。

from datetime import datetime

now = datetime.now()

print("年:", now.year)
print("月:", now.month)
print("日:", now.day)
print("時:", now.hour)
print("分:", now.minute)
print("秒:", now.second)

実行結果の例は次のとおりです。

年: 2026
月: 7
日: 18
時: 14
分: 35
秒: 42

このように、取得した日時から必要な部分だけを取り出せます。

例えば、現在の時刻に応じてメッセージを変更することもできます。

from datetime import datetime

now = datetime.now()

if now.hour < 12:
    print("おはようございます")
elif now.hour < 18:
    print("こんにちは")
else:
    print("こんばんは")

now.hourには、現在の「時」が0から23までの数値で格納されています。


現在の日付だけを取得する

時刻を含めず、現在の日付だけを取得したい場合は、date()を使用します。

from datetime import datetime

today = datetime.now().date()

print(today)

実行結果の例は次のとおりです。

2026-07-18

一度変数に代入してから、日付を取り出すこともできます。

from datetime import datetime

now = datetime.now()
today = now.date()

print(today)

どちらの書き方でも同じ結果になります。


現在の時刻だけを取得する

現在の時刻だけを取得したい場合は、time()を使用します。

from datetime import datetime

current_time = datetime.now().time()

print(current_time)

実行結果の例は次のとおりです。

14:35:42.123456

マイクロ秒も含まれるため、そのままでは少し見づらいことがあります。

表示形式を整える方法については、後ほど説明します。


指定した日付と時刻を作成する

datetimeを使って、任意の日付と時刻を作成することもできます。

from datetime import datetime

date_time = datetime(2026, 7, 18, 14, 30, 0)

print(date_time)

実行結果は次のとおりです。

2026-07-18 14:30:00

各数値は、次の順番で指定します。

datetime(年, 月, 日, 時, 分, 秒)

時刻を省略し、日付だけを指定することもできます。

from datetime import datetime

date_time = datetime(2026, 7, 18)

print(date_time)

実行結果は次のとおりです。

2026-07-18 00:00:00

時刻を省略した場合は、0時0分0秒として扱われます。


存在しない日付を指定した場合

datetimeでは、存在しない日付を指定するとエラーが発生します。

from datetime import datetime

date_time = datetime(2026, 2, 30)

print(date_time)

2月30日は存在しないため、次のようなエラーが発生します。

ValueError: day is out of range for month

月に13を指定した場合もエラーになります。

from datetime import datetime

date_time = datetime(2026, 13, 1)

実行結果は次のようになります。

ValueError: month must be in 1..12

ユーザーが入力した日付を扱う場合は、例外処理と組み合わせることがあります。

from datetime import datetime

try:
    date_time = datetime(2026, 2, 30)
    print(date_time)
except ValueError:
    print("正しい日付を指定してください")

実行結果は次のとおりです。

正しい日付を指定してください

例外処理については、第10回で説明したtry-except構文を使用しています。


日付と時刻の表示形式を変更する

datetime.now()の結果をそのまま表示すると、次のような形式になります。

2026-07-18 14:35:42.123456

プログラムによっては、次のように表示したい場合があります。

2026年07月18日

または、次のような形式です。

2026/07/18 14:35:42

日時の表示形式を変更するには、strftime()を使用します。

from datetime import datetime

now = datetime.now()

formatted_date = now.strftime("%Y年%m月%d日")

print(formatted_date)

実行結果の例は次のとおりです。

2026年07月18日

strftimeは、「string format time」の略として覚えると分かりやすいでしょう。

日時のデータを、指定した形式の文字列に変換するためのメソッドです。


strftimeで使用する主な書式

strftime()では、%Y%mなどの書式コードを使用します。

よく使用する書式コードは次のとおりです。

書式コード内容表示例
%Y西暦4桁2026
%y西暦下2桁26
%m07
%d18
%H時・24時間表記14
%M35
%S42
%A曜日名Saturday
%a曜日の省略名Sat

年月日をスラッシュで区切る場合は、次のように記述します。

from datetime import datetime

now = datetime.now()

print(now.strftime("%Y/%m/%d"))

実行結果の例は次のとおりです。

2026/07/18

日付と時刻を表示する場合は、次のように記述します。

from datetime import datetime

now = datetime.now()

print(now.strftime("%Y/%m/%d %H:%M:%S"))

実行結果の例は次のとおりです。

2026/07/18 14:35:42

日本語形式にすることもできます。

from datetime import datetime

now = datetime.now()

print(now.strftime("%Y年%m月%d日 %H時%M分%S秒"))

実行結果の例は次のとおりです。

2026年07月18日 14時35分42秒

文字列を日付に変換する

strftime()は、日時を文字列に変換するために使用しました。

反対に、文字列を日時データに変換したい場合は、strptime()を使用します。

from datetime import datetime

text = "2026/07/18"

date_time = datetime.strptime(text, "%Y/%m/%d")

print(date_time)

実行結果は次のとおりです。

2026-07-18 00:00:00

strptime()では、変換する文字列と、その文字列の形式を指定します。

datetime.strptime(文字列, 書式)

次の文字列を変換する場合を考えてみましょう。

2026-07-18 14:30:00

プログラムは次のようになります。

from datetime import datetime

text = "2026-07-18 14:30:00"

date_time = datetime.strptime(
    text,
    "%Y-%m-%d %H:%M:%S"
)

print(date_time)

実行結果は次のとおりです。

2026-07-18 14:30:00

文字列の形式と、指定する書式が一致している必要があります。

例えば、文字列がスラッシュ区切りになっているにもかかわらず、書式にハイフンを指定するとエラーになります。

from datetime import datetime

text = "2026/07/18"

date_time = datetime.strptime(text, "%Y-%m-%d")

この場合、文字列の形式と書式が一致していないため、ValueErrorが発生します。


strftimeとstrptimeの違い

strftime()strptime()は名前が似ていますが、変換する方向が異なります。

strftime

日時データを文字列に変換します。

from datetime import datetime

now = datetime.now()

text = now.strftime("%Y/%m/%d")

print(text)

strptime

文字列を日時データに変換します。

from datetime import datetime

text = "2026/07/18"

date_time = datetime.strptime(text, "%Y/%m/%d")

print(date_time)

違いを表にまとめると、次のようになります。

メソッド変換内容
strftime()日時から文字列へ変換
strptime()文字列から日時へ変換

最初は混同しやすいため、実際にコードを書きながら覚えていきましょう。


日付同士を比較する

datetime型の日付は、比較演算子を使って比較できます。

from datetime import datetime

date1 = datetime(2026, 7, 18)
date2 = datetime(2026, 8, 1)

print(date1 < date2)

実行結果は次のとおりです。

True

2026年7月18日は、2026年8月1日より前の日付であるため、Trueになります。

日付が同じかどうかも確認できます。

from datetime import datetime

date1 = datetime(2026, 7, 18)
date2 = datetime(2026, 7, 18)

print(date1 == date2)

実行結果は次のとおりです。

True

現在日時と指定日時を比較することもできます。

from datetime import datetime

now = datetime.now()
deadline = datetime(2026, 12, 31, 23, 59, 59)

if now < deadline:
    print("期限前です")
else:
    print("期限を過ぎています")

申込期限やキャンペーン期間などを判定するときに利用できます。


日付同士の差を求める

2つの日付を引き算すると、その日付の差を求められます。

from datetime import datetime

start_date = datetime(2026, 7, 1)
end_date = datetime(2026, 7, 18)

difference = end_date - start_date

print(difference)

実行結果は次のとおりです。

17 days, 0:00:00

日数だけを取得したい場合は、daysを使用します。

from datetime import datetime

start_date = datetime(2026, 7, 1)
end_date = datetime(2026, 7, 18)

difference = end_date - start_date

print(difference.days)

実行結果は次のとおりです。

17

指定した日付まで、あと何日あるかを計算することもできます。

from datetime import datetime

today = datetime.now()
target_date = datetime(2026, 12, 31)

difference = target_date - today

print("今年の終わりまで、あと", difference.days, "日です")

実行する日時によって、結果は変わります。


timedeltaを使って日付を計算する

「今日から7日後」や「3日前」の日付を求めたい場合は、timedeltaを使用します。

timedeltaを使用する場合は、次のようにインポートします。

from datetime import datetime, timedelta

現在日時から7日後を求めてみましょう。

from datetime import datetime, timedelta

now = datetime.now()
one_week_later = now + timedelta(days=7)

print("現在:", now)
print("7日後:", one_week_later)

実行結果の例は次のとおりです。

現在: 2026-07-18 14:35:42.123456
7日後: 2026-07-25 14:35:42.123456

3日前の日付を求める場合は、引き算を使用します。

from datetime import datetime, timedelta

now = datetime.now()
three_days_ago = now - timedelta(days=3)

print(three_days_ago)

実行結果の例は次のとおりです。

2026-07-15 14:35:42.123456

時間や分を加算する

timedeltaでは、日数だけでなく、時間や分、秒も指定できます。

3時間後を求める

from datetime import datetime, timedelta

now = datetime.now()
later = now + timedelta(hours=3)

print(later)

30分後を求める

from datetime import datetime, timedelta

now = datetime.now()
later = now + timedelta(minutes=30)

print(later)

10秒後を求める

from datetime import datetime, timedelta

now = datetime.now()
later = now + timedelta(seconds=10)

print(later)

複数の値を同時に指定することもできます。

from datetime import datetime, timedelta

now = datetime.now()

later = now + timedelta(
    days=1,
    hours=2,
    minutes=30
)

print(later)

この例では、現在日時から1日と2時間30分後の日時を計算しています。


曜日を取得する

weekday()を使用すると、曜日を数値で取得できます。

from datetime import datetime

now = datetime.now()

print(now.weekday())

weekday()では、月曜日を0として曜日を表します。

数値曜日
0月曜日
1火曜日
2水曜日
3木曜日
4金曜日
5土曜日
6日曜日

曜日名を表示する場合は、リストを使用できます。

from datetime import datetime

weekdays = [
    "月曜日",
    "火曜日",
    "水曜日",
    "木曜日",
    "金曜日",
    "土曜日",
    "日曜日"
]

now = datetime.now()
weekday_number = now.weekday()

print(weekdays[weekday_number])

例えば、土曜日に実行した場合は、次のように表示されます。

土曜日

日付と曜日を一緒に表示することもできます。

from datetime import datetime

weekdays = [
    "月曜日",
    "火曜日",
    "水曜日",
    "木曜日",
    "金曜日",
    "土曜日",
    "日曜日"
]

now = datetime.now()

date_text = now.strftime("%Y年%m月%d日")
weekday_text = weekdays[now.weekday()]

print(f"{date_text}は{weekday_text}です")

実行結果の例は次のとおりです。

2026年07月18日は土曜日です

ここでは、第12回で説明したf文字列も使用しています。


ファイル名に日時を追加する

日付と時刻は、ファイル名を作成するときにもよく使用されます。

例えば、次のようなファイル名を作成できます。

log_20260718_143542.txt

プログラムは次のようになります。

from datetime import datetime

now = datetime.now()

file_name = now.strftime("log_%Y%m%d_%H%M%S.txt")

print(file_name)

実行結果の例は次のとおりです。

log_20260718_143542.txt

年月日や時刻をファイル名に含めることで、ファイル名の重複を防ぎやすくなります。

実際にファイルを作成する場合は、次のように記述できます。

from datetime import datetime

now = datetime.now()
file_name = now.strftime("log_%Y%m%d_%H%M%S.txt")

with open(file_name, "w", encoding="utf-8") as file:
    file.write("処理を開始しました")

print(file_name, "を作成しました")

ファイル操作については、第11回で説明したwith open()を使用しています。


処理時刻を記録する

プログラムのログに処理時刻を記録する場合にも、datetimeを使用できます。

from datetime import datetime

now = datetime.now()
time_text = now.strftime("%Y/%m/%d %H:%M:%S")

print(f"[{time_text}] 処理を開始しました")

実行結果の例は次のとおりです。

[2026/07/18 14:35:42] 処理を開始しました

ファイルにログを追記する場合は、次のように記述できます。

from datetime import datetime

now = datetime.now()
time_text = now.strftime("%Y/%m/%d %H:%M:%S")

with open("log.txt", "a", encoding="utf-8") as file:
    file.write(f"[{time_text}] 処理を開始しました\n")

ファイルを開くモードに"a"を指定すると、既存の内容を残したまま末尾に文章を追加できます。


datetimeを使ったサンプルプログラム

最後に、現在の日付、時刻、曜日を表示するプログラムを作成してみましょう。

from datetime import datetime

weekdays = [
    "月曜日",
    "火曜日",
    "水曜日",
    "木曜日",
    "金曜日",
    "土曜日",
    "日曜日"
]

now = datetime.now()

date_text = now.strftime("%Y年%m月%d日")
time_text = now.strftime("%H時%M分%S秒")
weekday_text = weekdays[now.weekday()]

print("現在の日付:", date_text)
print("現在の時刻:", time_text)
print("今日の曜日:", weekday_text)

実行結果の例は次のとおりです。

現在の日付: 2026年07月18日
現在の時刻: 14時35分42秒
今日の曜日: 土曜日

これまで学習した変数、リスト、f文字列などと組み合わせることで、日付や時刻を分かりやすく表示できます。


まとめ

今回は、datetimeモジュールを使って、Pythonで日付と時間を扱う方法を説明しました。

今回のポイントは次のとおりです。

  • datetime.now()で現在の日付と時刻を取得できる
  • yearmonthdayなどで値を個別に取得できる
  • strftime()で日時を文字列に変換できる
  • strptime()で文字列を日時に変換できる
  • 日付同士を比較できる
  • 日付同士を引き算して差を求められる
  • timedeltaで数日後や数時間後を計算できる
  • weekday()で曜日を取得できる

特に、次のコードは非常によく使用します。

from datetime import datetime

print(datetime.now())

表示形式を整える場合は、次のように記述します。

from datetime import datetime

now = datetime.now()

print(now.strftime("%Y/%m/%d %H:%M:%S"))

datetimeは、ログの作成、ファイル名の生成、期限の判定、処理時間の記録など、さまざまなプログラムで使用されます。

最初からすべての書式コードを覚える必要はありません。

まずは、現在日時を取得するdatetime.now()と、表示形式を変更するstrftime()から使ってみましょう。

コメント

タイトルとURLをコピーしました