【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の便利な道具箱をどんどん紹介していく予定です。お楽しみに!
- 【Python標準ライブラリ入門 第2回】偶然をプログラムに!randomモジュールで乱数を使いこなそう
- 【Python標準ライブラリ入門 第10回】日常をちょこっと便利に!timeモジュールとwebbrowserモジュール活用術 🕰️🌐
コメント
コメントを投稿