サイトアイコン アマチュア無線局JS2IIU

【Python】datetimeモジュールを使いこなす

こんにちは、JS2IIUです。
Pythonで日付や時刻を扱うなら、datetimeモジュールは欠かせません。この記事では、datetimeモジュールの基本から応用までを網羅的に、コード例を交えながら丁寧に説明していきます。

1. はじめに:datetimeモジュールとは?

datetimeモジュールは、Pythonに標準で組み込まれているライブラリで、日付や時刻を扱うための様々な機能を提供します。

具体的には、

などが可能です。

2. datetimeモジュールの基本

datetimeモジュールを使うには、まずモジュールをインポートする必要があります。

Python
import datetime

datetimeモジュールには、日付や時刻を扱うための様々なオブジェクトが用意されています。主なオブジェクトは以下の通りです。

これらのオブジェクトを使い分けることで、様々な日付と時刻の処理を行うことができます。

3. 各オブジェクトの詳細

3.1 timedeltaオブジェクト

timedeltaオブジェクトは、2つの日付や時刻の差を表す、時間間隔を表現するためのオブジェクトです。

Python
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オブジェクトは、日付(年、月、日)を表現するためのオブジェクトです。

Python
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())  # 例:6

dateオブジェクトは、今日の日付の取得、特定の日付の作成、曜日や週番号の取得などに利用できます。

3.3 datetimeオブジェクト

datetimeオブジェクトは、日付と時刻を組み合わせた情報を表現するためのオブジェクトです。

Python
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:00

datetimeオブジェクトは、現在の日時の取得、特定の日時の作成、日付と時刻のフォーマット変換などに利用できます。

3.4 timeオブジェクト

timeオブジェクトは、時刻(時、分、秒、マイクロ秒)を表現するためのオブジェクトです。

Python
import datetime

# 特定の時刻を作成
time1 = datetime.time(12, 30, 0)
print(time1)  # 12:30:00

3.5 tzinfoオブジェクト

tzinfoオブジェクトは、タイムゾーン情報を抽象的に表現するためのオブジェクトです。これは抽象クラスであり、直接インスタンス化することはできません。

3.6 timezoneオブジェクト

timezoneオブジェクトは、tzinfoの具象クラスで、UTCからの固定オフセットを表現します。

Python
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:00

4. 時間文字列とオブジェクトの相互変換

datetimeオブジェクトと時間文字列の相互変換には、strptime()strftime()メソッドを使用します。

これらのメソッドでは、フォーマットコードを使用して日付と時刻の形式を指定します。主なフォーマットコードは以下の通りです。

フォーマットコード説明
%Y年(4桁)
%m月(2桁)
%d日(2桁)
%H時(24時間表記)
%M
%S
%zUTCオフセット
%Zタイムゾーン名
Python
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属性にタイムゾーン情報が設定されています。

Python
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:00

Naiveオブジェクトは、tzinfo属性がNoneになっています。

Python
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オブジェクトのタイムゾーンを変換することができます。

Python
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:00

6. 時間情報の保持の仕方、精度

datetimeモジュールでは、日付と時刻の情報は、内部的にUnix時間からの秒数として保持されます。Unix時間とは、1970年1月1日0時0分0秒UTCからの経過秒数のことです。

datetimeモジュールの精度はマイクロ秒です。

7. 各オブジェクトでサポートされる演算

timedeltaオブジェクトを使用することで、日付や時刻の加算、減算を行うことができます。

Python
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オブジェクトは、比較演算子を使用して比較することができます。

Python
import datetime

date1 = datetime.date(2023, 1, 1)
date2 = datetime.date(2024, 1, 1)

print(date1 < date2)  # True

8. datetimeモジュールの応用

datetimeモジュールは、様々な日付と時刻処理に利用できます。

実用的なコード例

Python
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}曜日です")
Python
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モジュールをマスターしてください。

モバイルバージョンを終了