こんにちは、JS2IIUです。
Pythonで日付や時刻を扱うなら、datetimeモジュールは欠かせません。この記事では、datetimeモジュールの基本から応用までを網羅的に、コード例を交えながら丁寧に説明していきます。
1. はじめに:datetimeモジュールとは?
datetimeモジュールは、Pythonに標準で組み込まれているライブラリで、日付や時刻を扱うための様々な機能を提供します。
具体的には、
- 日付や時刻の表現
- 日付と時刻の計算
- 日付と時刻の比較
- 日付と時刻のフォーマット変換
などが可能です。
2. datetimeモジュールの基本
datetimeモジュールを使うには、まずモジュールをインポートする必要があります。
import datetimedatetimeモジュールには、日付や時刻を扱うための様々なオブジェクトが用意されています。主なオブジェクトは以下の通りです。
dateオブジェクト:日付(年、月、日)を表現します。timeオブジェクト:時刻(時、分、秒、マイクロ秒)を表現します。datetimeオブジェクト:日付と時刻を組み合わせた情報を表現します。timedeltaオブジェクト:時間間隔を表現します。tzinfoオブジェクト:タイムゾーン情報を抽象的に表現します。timezoneオブジェクト:tzinfoの具象クラスで、UTCからの固定オフセットを表現します。
これらのオブジェクトを使い分けることで、様々な日付と時刻の処理を行うことができます。
3. 各オブジェクトの詳細
3.1 timedeltaオブジェクト
timedeltaオブジェクトは、2つの日付や時刻の差を表す、時間間隔を表現するためのオブジェクトです。
import datetime
# 1日と1時間を表すtimedeltaオブジェクトを作成
delta = datetime.timedelta(days=1, hours=1)
print(delta) # 1 day, 1:00:00
print(delta.days) # 1
print(delta.seconds) # 3600
print(delta.total_seconds()) # 86400.0 timedeltaオブジェクトは、日付の計算や経過時間の測定などに利用できます。
3.2 dateオブジェクト
dateオブジェクトは、日付(年、月、日)を表現するためのオブジェクトです。
import datetime
# 今日の日付を取得
today = datetime.date.today()
print(today) # 例:2024-12-14
# 特定の日付を作成
date1 = datetime.date(2023, 1, 1)
print(date1) # 2023-01-01
# 曜日を取得 (月曜日が0、日曜日が6)
print(today.weekday()) # 例:5 (土曜日)
# ISO形式の曜日を取得 (月曜日が1、日曜日が7)
print(today.isoweekday()) # 例:6dateオブジェクトは、今日の日付の取得、特定の日付の作成、曜日や週番号の取得などに利用できます。
3.3 datetimeオブジェクト
datetimeオブジェクトは、日付と時刻を組み合わせた情報を表現するためのオブジェクトです。
import datetime
# 現在の日時を取得
now = datetime.datetime.now()
print(now) # 例:2024-12-14 23:35:10.123456
# 特定の日時を作成
datetime1 = datetime.datetime(2023, 1, 1, 12, 30, 0)
print(datetime1) # 2023-01-01 12:30:00
# 日付と時刻のフォーマット変換
formatted_datetime = now.strftime("%Y年%m月%d日 %H時%M分%S秒")
print(formatted_datetime) # 例:2024年12月14日 23時35分10秒
# 文字列からdatetimeオブジェクトへの変換
datetime_from_str = datetime.datetime.strptime("2024/12/15", "%Y/%m/%d")
print(datetime_from_str) # 2024-12-15 00:00:00datetimeオブジェクトは、現在の日時の取得、特定の日時の作成、日付と時刻のフォーマット変換などに利用できます。
3.4 timeオブジェクト
timeオブジェクトは、時刻(時、分、秒、マイクロ秒)を表現するためのオブジェクトです。
import datetime
# 特定の時刻を作成
time1 = datetime.time(12, 30, 0)
print(time1) # 12:30:003.5 tzinfoオブジェクト
tzinfoオブジェクトは、タイムゾーン情報を抽象的に表現するためのオブジェクトです。これは抽象クラスであり、直接インスタンス化することはできません。
3.6 timezoneオブジェクト
timezoneオブジェクトは、tzinfoの具象クラスで、UTCからの固定オフセットを表現します。
import datetime
# UTC+9のタイムゾーンを作成
jst = datetime.timezone(datetime.timedelta(hours=9))
# タイムゾーンを指定して現在日時を取得
now_jst = datetime.datetime.now(jst)
print(now_jst) # 例:2024-12-15 08:35:10.123456+09:004. 時間文字列とオブジェクトの相互変換
datetimeオブジェクトと時間文字列の相互変換には、strptime()とstrftime()メソッドを使用します。
strptime():時間文字列をdatetimeオブジェクトに変換します。strftime():datetimeオブジェクトを時間文字列に変換します。
これらのメソッドでは、フォーマットコードを使用して日付と時刻の形式を指定します。主なフォーマットコードは以下の通りです。
| フォーマットコード | 説明 |
|---|---|
%Y | 年(4桁) |
%m | 月(2桁) |
%d | 日(2桁) |
%H | 時(24時間表記) |
%M | 分 |
%S | 秒 |
%z | UTCオフセット |
%Z | タイムゾーン名 |
import datetime
# 文字列からdatetimeオブジェクトへの変換
datetime_from_str = datetime.datetime.strptime("2024/12/15 12:30:00", "%Y/%m/%d %H:%M:%S")
print(datetime_from_str) # 2024-12-15 12:30:00
# datetimeオブジェクトから文字列への変換
formatted_datetime = datetime_from_str.strftime("%Y年%m月%d日 %H時%M分%S秒")
print(formatted_datetime) # 2024年12月15日 12時30分00秒5. Aware オブジェクトと Naive オブジェクト
datetimeオブジェクトには、タイムゾーン情報を持つAwareオブジェクトと、タイムゾーン情報を持たないNaiveオブジェクトがあります。
Awareオブジェクトは、tzinfo属性にタイムゾーン情報が設定されています。
import datetime
# Awareオブジェクト
aware_datetime = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9)))
print(aware_datetime) # 例:2024-12-15 08:35:10.123456+09:00
print(aware_datetime.tzinfo) # UTC+09:00Naiveオブジェクトは、tzinfo属性がNoneになっています。
import datetime
# Naiveオブジェクト
naive_datetime = datetime.datetime.now()
print(naive_datetime) # 例:2024-12-14 23:35:10.123456
print(naive_datetime.tzinfo) # Noneタイムゾーンを扱う場合は、Awareオブジェクトを使用する必要があります。astimezone()メソッドを使用することで、Awareオブジェクトのタイムゾーンを変換することができます。
import datetime
# UTC+9のタイムゾーンを持つAwareオブジェクト
aware_datetime = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9)))
# UTC+0に変換
utc_datetime = aware_datetime.astimezone(datetime.timezone.utc)
print(utc_datetime) # 例:2024-12-14 14:35:10.123456+00:006. 時間情報の保持の仕方、精度
datetimeモジュールでは、日付と時刻の情報は、内部的にUnix時間からの秒数として保持されます。Unix時間とは、1970年1月1日0時0分0秒UTCからの経過秒数のことです。
datetimeモジュールの精度はマイクロ秒です。
7. 各オブジェクトでサポートされる演算
timedeltaオブジェクトを使用することで、日付や時刻の加算、減算を行うことができます。
import datetime
today = datetime.date.today()
# 1日後の日付を計算
tomorrow = today + datetime.timedelta(days=1)
print(tomorrow)
# 1週間前の日付を計算
one_week_ago = today - datetime.timedelta(weeks=1)
print(one_week_ago)また、dateオブジェクトとdatetimeオブジェクトは、比較演算子を使用して比較することができます。
import datetime
date1 = datetime.date(2023, 1, 1)
date2 = datetime.date(2024, 1, 1)
print(date1 < date2) # True8. datetimeモジュールの応用
datetimeモジュールは、様々な日付と時刻処理に利用できます。
- 日付の計算:月末日、月初日、曜日計算
- 期間の計算:経過時間、残日数
- 日付のフォーマット変換:ログ出力、データ処理
- タイムゾーンの処理:国際化対応
実用的なコード例
- 特定の日付の曜日を求める
import datetime
def get_day_of_week(year, month, day):
"""
特定の日付の曜日を日本語で返す関数
Args:
year: 年
month: 月
day: 日
Returns:
曜日(日本語)
"""
day_of_week = datetime.date(year, month, day).weekday()
days = ["月", "火", "水", "木", "金", "土", "日"]
return days[day_of_week]
# 2023年12月25日の曜日を求める
day_of_week = get_day_of_week(2023, 12, 25)
print(f"2023年12月25日は{day_of_week}曜日です")- 誕生日から年齢を計算する
import datetime
def calculate_age(birth_year, birth_month, birth_day):
"""
誕生日から年齢を計算する関数
Args:
birth_year: 誕生年
birth_month: 誕生月
birth_day: 誕生日
Returns:
年齢
"""
today = datetime.date.today()
birthday = datetime.date(birth_year, birth_month, birth_day)
age = today.year - birthday.year - ((today.month, today.day) < (birthday.month, birthday.day))
return age
# 1990年4月1日の年齢を計算する
age = calculate_age(1990, 4, 1)
print(f"年齢は{age}歳です")9. まとめ
datetimeモジュールは、Pythonで日付と時刻を扱うための強力なツールです。各オブジェクトとメソッドを理解することで、様々な日付と時刻処理が可能になります。本記事を参考に、datetimeモジュールをマスターしてください。

