【Python標準ライブラリ入門 第1回】日付と時刻を自由自在に!datetimeモジュール徹底活用術

「プログラムで今日の日付ってどうやって取得するの?」
「イベントまでの残り日数を計算したいけど、Pythonでできる?」
「ログファイルに正確なタイムスタンプを残したい!」

こんにちは! Pythonプログラミングの学習、楽しんでいますか? これまでPythonの基本的な文法やオブジェクト指向の考え方について学んできましたが、今回からはPythonが標準で提供している便利な「道具箱」である標準ライブラリの世界を探検していきましょう。標準ライブラリを使いこなせると、自分で一からコードを書かなくても、様々な複雑な処理が簡単に行えるようになります。

記念すべき第1回は、プログラムであらゆる場面で必要となる日付と時刻の操作を扱うためのdatetimeモジュールです。この記事を読めば、Pythonで現在の日付時刻の取得、特定の日付の表現、日付同士の計算、そして表示形式の変更(フォーマット)といった基本的な操作がマスターできます。datetimeモジュールを使いこなして、あなたのプログラムをもっと実用的に進化させましょう!(他にも色々紹介しています


1. datetimeモジュールとは? なぜ重要?

datetimeモジュールは、Pythonで日付や時刻に関する情報を扱うための機能を集めた標準ライブラリです。標準ライブラリなので、別途インストール作業は不要で、Pythonがインストールされていればすぐに利用できます。

プログラムにおいて日付や時刻を扱う場面は非常に多く、例えば以下のようなケースで役立ちます。

  • ログファイルにイベントが発生した時刻を記録する
  • ユーザーの誕生日から年齢を計算する
  • 未来のイベントまでのカウントダウンを表示する
  • データのタイムスタンプを処理・分析する
  • ファイルの最終更新日時を取得・比較する

datetimeモジュールは、これらの処理を簡単かつ正確に行うための様々な「クラス」と「関数」を提供しています。主なクラスとしては、日付を表すdateクラス、時刻を表すtimeクラス、日付と時刻の両方を表すdatetimeクラス、そして期間や時間差を表すtimedeltaクラスなどがあります。


2. datetimeモジュールの基本的な使い方

まずは、datetimeモジュールをプログラムで使うための準備と、基本的なオブジェクトの作り方を見ていきましょう。

2.1. モジュールのインポート

datetimeモジュールを使うには、まずプログラムの先頭でインポート文を記述します。

# datetimeモジュール全体をインポート
import datetime

# または、よく使うクラスを個別にインポートすることも可能
# from datetime import date, time, datetime, timedelta

この記事では、主に個別のクラスをインポートする方法 (from datetime import ...) を使って説明していきますが、datetime.dateのようにモジュール名から記述する方法でも同じように動作します。

2.2. 現在の日付・時刻の取得

プログラムを実行している現在の「今」の日付や時刻を取得するのは非常によく使う操作です。

from datetime import date, datetime

# 今日の日付を取得 (dateオブジェクト)
today_date = date.today()
print(f"今日の日付: {today_date}")
print(f"今日の年: {today_date.year}")
print(f"今日の月: {today_date.month}")
print(f"今日の日: {today_date.day}")
print(f"今日の曜日 (月曜0~日曜6): {today_date.weekday()}") # 月曜日が0、日曜日が6
print(f"今日の曜日 (ISO形式 月曜1~日曜7): {today_date.isoweekday()}") # 月曜日が1、日曜日が7

# 現在の日付と時刻を取得 (datetimeオブジェクト)
now_datetime = datetime.now()
print(f"\n現在の日付と時刻: {now_datetime}")
print(f"現在の時: {now_datetime.hour}")
print(f"現在の分: {now_datetime.minute}")
print(f"現在の秒: {now_datetime.second}")
print(f"現在のマイクロ秒: {now_datetime.microsecond}")

date.today()dateオブジェクトを、datetime.now()datetimeオブジェクトを返します。これらのオブジェクトは、年(year)、月(month)、日(day)、時(hour)などの情報を属性として持っています。

2.3. 特定の日付や時刻を表すオブジェクトの作成

特定の日付や時刻をプログラム内で表現したい場合は、各クラスのコンストラクタ(__init__メソッドのようなもの)を使ってオブジェクトを作成します。

  • date(年, 月, 日): 特定の日付を表すdateオブジェクトを作成します。
  • time(時, 分, 秒, マイクロ秒): 特定の時刻を表すtimeオブジェクトを作成します。時、分以外の引数は省略可能です(デフォルトは0)。
  • datetime(年, 月, 日, 時, 分, 秒, マイクロ秒): 特定の日付と時刻を表すdatetimeオブジェクトを作成します。時、分以外の引数は省略可能です。
from datetime import date, time, datetime

# 特定の日付
my_birthday = date(1996, 8, 15)
print(f"\n私の誕生日: {my_birthday}")
print(f"その年の曜日: {my_birthday.weekday()} (月曜0~日曜6)")

# 特定の時刻
meeting_time = time(10, 30, 0) # 10時30分00秒
print(f"会議の時間: {meeting_time}")
print(f"会議の時: {meeting_time.hour}")

# 特定の日付と時刻
event_start = datetime(2025, 12, 24, 18, 0, 0) # 2025年12月24日 18時00分00秒
print(f"イベント開始日時: {event_start}")
print(f"イベントの月: {event_start.month}")
print(f"イベントの分: {event_start.minute}")

3. 日付・時刻のフォーマット変換:文字列との相互変換

プログラムで日付や時刻を扱う際、人間が読みやすい特定の形式の文字列で表示したり、逆に特定の形式の文字列から日付時刻オブジェクトを生成したりする必要がよくあります。これにはstrftime()メソッドとstrptime()メソッドを使います。

3.1. strftime()メソッド:日付時刻オブジェクト → 文字列

strftime()メソッド(string format timeの略)は、date, time, datetimeオブジェクトを、指定した書式(フォーマット)の文字列に変換します。書式は「書式化コード」と呼ばれる特別な文字列(例: %Y, %m, %d)を使って指定します。

主な書式化コード (一部):

  • %Y: 年 (4桁、例: 2025)
  • %y: 年 (2桁、例: 25)
  • %m: 月 (2桁、0埋め、例: 05, 12)
  • %d: 日 (2桁、0埋め、例: 01, 25)
  • %H: 時 (24時間表記, 2桁、0埋め、例: 08, 17)
  • %I: 時 (12時間表記, 2桁、0埋め、例: 08, 05)
  • %p: 午前/午後 (AM/PM)
  • %M: 分 (2桁、0埋め、例: 00, 30)
  • %S: 秒 (2桁、0埋め、例: 00, 59)
  • %A: 曜日名(英語のフルネーム、例: Sunday, Monday)※環境により日本語も可
  • %a: 曜日名(英語の短縮形、例: Sun, Mon)※環境により日本語も可
  • %B: 月名(英語のフルネーム、例: January)※環境により日本語も可
  • %b: 月名(英語の短縮形、例: Jan)※環境により日本語も可
from datetime import datetime

now = datetime.now()
print(f"\n現在のdatetimeオブジェクト: {now}")

# 様々なフォーマットで文字列に変換
s1 = now.strftime("%Y年%m月%d日")
print(f"フォーマット1: {s1}") # 例: 2025年05月25日

s2 = now.strftime("%Y/%m/%d %H:%M:%S")
print(f"フォーマット2: {s2}") # 例: 2025/05/25 23:30:15

s3 = now.strftime("%A, %B %d, %Y")
print(f"フォーマット3: {s3}") # 例: Sunday, May 25, 2025

s4 = now.strftime("今日は今年の%j日目です。") # %j: 年の通算日
print(f"フォーマット4: {s4}")

3.2. strptime()メソッド:文字列 → 日付時刻オブジェクト

strptime()メソッド(string parse timeの略)は、特定の書式の文字列を解析し、対応するdatetimeオブジェクトに変換します。こちらはdatetimeクラスのメソッドとして呼び出します。

from datetime import datetime

date_string1 = "2024-07-10"
date_string2 = "2023/11/05 14:30:55"
date_string3 = "Dec 25, 2025 18:00"

# 文字列をdatetimeオブジェクトに変換
dt1 = datetime.strptime(date_string1, "%Y-%m-%d")
print(f"\n文字列 '{date_string1}' -> datetime: {dt1}")
print(f"その年: {dt1.year}")

dt2 = datetime.strptime(date_string2, "%Y/%m/%d %H:%M:%S")
print(f"文字列 '{date_string2}' -> datetime: {dt2}")
print(f"その時: {dt2.hour}")

# %b はロケール(地域設定)に依存することがあるので注意
# 英語の月名略称を確実にパースするには、ロケール設定が必要な場合もある
# import locale
# locale.setlocale(locale.LC_TIME, 'en_US.UTF-8') # 例: 英語ロケールに設定
dt3 = datetime.strptime(date_string3, "%b %d, %Y %H:%M")
print(f"文字列 '{date_string3}' -> datetime: {dt3}")

文字列の形式と、strptime()に指定する書式化コードが完全に一致している必要があります。一致しない場合はValueErrorが発生します。


4. 日付・時刻の計算:timedeltaオブジェクトの活用

「3日後の日付は?」「2つのイベントの間は何日間?」といった日付や時刻の計算を行いたい場合、timedeltaオブジェクトが非常に役立ちます。timedeltaは、二つの日付や時刻の間の差、あるいはある特定の期間を表します。

4.1. timedeltaオブジェクトの作成

timedeltaオブジェクトは、日数、秒数、マイクロ秒数、ミリ秒数、分数、時間数、週数などを引数に取って作成します。

from datetime import timedelta

one_day = timedelta(days=1)
print(f"\n1日という期間: {one_day}")

two_hours_30_mins = timedelta(hours=2, minutes=30)
print(f"2時間30分という期間: {two_hours_30_mins}")

one_week_and_3_days = timedelta(weeks=1, days=3)
print(f"1週間と3日という期間: {one_week_and_3_days}")

4.2. 日付・時刻オブジェクトとtimedeltaオブジェクトの演算

dateオブジェクトやdatetimeオブジェクトに対して、timedeltaオブジェクトを使って加算や減算を行うことができます。

from datetime import date, datetime, timedelta

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

# 今日の1週間後
one_week = timedelta(weeks=1)
next_week_date = today + one_week
print(f"\n今日 ({today}) の1週間後: {next_week_date}")

# 現在時刻の3時間30分前
three_half_hours_ago = timedelta(hours=3, minutes=30)
past_datetime = now - three_half_hours_ago
print(f"現在 ({now}) の3時間30分前: {past_datetime}")

# 2つの日付の差 (結果はtimedeltaオブジェクト)
date1 = date(2025, 12, 25)
date2 = date(2025, 1, 1)
difference = date1 - date2
print(f"{date1} と {date2} の差: {difference}")
print(f"日数にすると: {difference.days} 日")

# 2つのdatetimeオブジェクトの差
datetime1 = datetime(2025, 5, 25, 10, 0, 0)
datetime2 = datetime(2025, 5, 20, 12, 30, 0)
time_diff = datetime1 - datetime2
print(f"{datetime1} と {datetime2} の時間差: {time_diff}")
print(f"総秒数にすると: {time_diff.total_seconds()} 秒")

timedeltaオブジェクトの.days属性で日数の差を、.total_seconds()メソッドで総秒数の差を取得できます。


5. 実践的な例:datetimeモジュールを使ってみよう

5.1. イベントまでのカウントダウン

from datetime import datetime, date

event_name = "次のオリンピック開催"
event_date_str = "2028-07-21" # 例: 2028年ロサンゼルスオリンピック
event_date = datetime.strptime(event_date_str, "%Y-%m-%d").date() # .date()でdateオブジェクトに変換

today = date.today()
days_until_event = event_date - today

print(f"\n--- {event_name} までのカウントダウン ---")
if days_until_event.days > 0:
    print(f"{event_name} ({event_date.strftime('%Y年%m月%d日')}) まで、あと {days_until_event.days} 日です!")
elif days_until_event.days == 0:
    print(f"今日は {event_name} の当日です!")
else:
    print(f"{event_name} は {abs(days_until_event.days)} 日前に終了しました。") # abs()で絶対値

5.2. 簡単な年齢計算

from datetime import date

def calculate_age(birthdate_str):
    """誕生日文字列 YYYY-MM-DD から年齢を計算する関数"""
    birthdate = date.fromisoformat(birthdate_str) # YYYY-MM-DD形式ならfromisoformatが便利
    today = date.today()
    # 今年の誕生日がまだ来ていなければ1歳引く
    age = today.year - birthdate.year - ((today.month, today.day) < (birthdate.month, birthdate.day))
    return age

birthday_input = "1996-08-15"
age = calculate_age(birthday_input)
print(f"\n誕生日 {birthday_input} の人は、現在 {age} 歳です。")

まとめ:datetimeモジュールで日付と時刻の達人に!

今回は、Pythonの標準ライブラリ解説シリーズ第1回として、datetimeモジュールの基本的な使い方を学びました。

  • 現在の日付や時刻の取得 (date.today(), datetime.now())
  • 特定の日付や時刻を表すオブジェクト (date, time, datetime) の作成
  • 日付時刻オブジェクトと文字列の相互変換 (strftime(), strptime())
  • 期間や時間差を表すtimedeltaオブジェクトと、それを使った日付・時刻の計算

datetimeモジュールは非常に多機能で奥が深いですが、今回紹介した基本をマスターするだけでも、プログラムで日付や時刻を扱う多くの場面で役立つはずです。ログの記録、データのタイムスタンプ処理、スケジュールの管理など、様々な応用が考えられます。

次回以降の標準ライブラリ解説シリーズでも、Pythonの便利な道具箱をどんどん紹介していく予定です。お楽しみに!


コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀