第14章 日付と時間
日付と時間の基本
Pythonのdatetimeモジュールは、日付と時間の操作に関する多くのクラスを提供するもので、プログラミングにおける日時の取り扱いに不可欠なモジュールの一つです。
以下は、datetimeモジュールに含まれる主要なクラスとその機能を紹介します。
date: 年、月、日を表現するためのクラス。
from datetime import date
today = date.today() # 現在の日付を取得
print(today) # 例: 2023-07-07
time: 一日の中の時間を表現するためのクラス。時間、分、秒、マイクロ秒を持つ。
from datetime import time
t = time(15, 30) # 15時30分を表す
print(t) # 15:30:00
datetime: 日付と時間の組み合わせを表現するためのクラス。
from datetime import datetime
now = datetime.now() # 現在の日時を取得
print(now) # 例: 2023-07-07 15:30:00
timedelta: 二つの日時の間の期間や差分を表現するためのクラス。
from datetime import timedelta
delta = timedelta(days=7)
one_week_later = today + delta # 今日から1週間後の日付を取得
print(one_week_later)
timezone: Python 3.2から追加された、UTCからの固定のオフセットを持つタイムゾーンを表現するクラス。
from datetime import timezone
utc_offset = timezone(timedelta(hours=9))
dt_with_timezone = datetime(2023, 7, 7, tzinfo=utc_offset)
print(dt_with_timezone)
日付と時間の操作
日付や時間の加算、減算
日付や時間の加算、減算はtimedeltaクラスを使用します。以下の例では、現在の日時から3日後と3日前の日時を計算しています。
from datetime import datetime, timedelta
# 現在の日時を取得
now = datetime.now()
print(f"現在: {now}")
# 3日後の日時を計算
three_days_later = now + timedelta(days=3)
print(f"3日後: {three_days_later}")
# 3日前の日時を計算
three_days_ago = now - timedelta(days=3)
print(f"3日前: {three_days_ago}")
タイムデルタを使用した操作
timedeltaは日付や時間の差分を表すクラスです。日、時間、分、秒、マイクロ秒を引数として与えることができます。
from datetime import timedelta
# 2時間30分のタイムデルタを作成
delta = timedelta(hours=2, minutes=30)
print(delta) # 2:30:00
週の日や月の日を取得する方法
datetimeオブジェクトから曜日や日を取得することができます。曜日はweekday()メソッドを使って取得でき、月曜日が0、日曜日が6として表されます。
date = datetime(2023, 7, 7) # 2023年7月7日
# 曜日を取得(0:月曜日, 6:日曜日)
day_of_week = date.weekday()
print(f"曜日: {day_of_week}") # 4, 2023年7月7日は金曜日
# 日を取得
day_of_month = date.day
print(f"日: {day_of_month}") # 7
日付と時間のフォーマット
Pythonのdatetimeモジュールには、日付や時間を様々なフォーマットで表現するための機能が含まれています。特に、strftimeメソッドとstrptimeメソッドは、日付や時間のフォーマットを扱う上で非常に便利です。
日付や時間のオブジェクトを文字列に変換
strftimeメソッドを使用すると、datetimeオブジェクトを指定したフォーマットの文字列に変換することができます。以下はいくつかの一般的なフォーマットコードの例です。
- %Y: 4桁の年 (2021, 2022など)
- %m: 2桁の月 (01, 02,..., 12)
- %d: 2桁の日 (01, 02,..., 31)
- %H: 2桁の時間 (00, 01,..., 23)
- %M: 2桁の分 (00, 01,..., 59)
- %S: 2桁の秒 (00, 01,..., 59)
from datetime import datetime
now = datetime.now()
# 年-月-日 時:分:秒 の形式で出力
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted) # 例: "2023-07-07 12:34:56"
文字列を日付や時間のオブジェクトに変換
一方、strptimeメソッドは、指定したフォーマットの文字列をdatetimeオブジェクトに変換します。
date_str = "2023-07-07 12:34:56"
parsed_date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(parsed_date) # 2023-07-07 12:34:56
その他のフォーマットコード/h5>
以下はその他の一般的なフォーマットコードの例です。
- %a: 曜日の省略形 (Mon, Tue, Wed,...)
- %A: 曜日のフルネーム (Monday, Tuesday,...)
- %b: 月の省略形 (Jan, Feb,...)
- %B: 月のフルネーム (January, February,...)
- %p: AMまたはPM
- %f: マイクロ秒 (6桁)
タイムゾーン
Pythonのdatetimeモジュールでは、タイムゾーンを意識した日付や時間の操作が可能ですが、実際のタイムゾーン情報の取り扱いは簡易的です。そこで、より実践的なタイムゾーンの操作やサマータイムの対応、さらには世界各地のタイムゾーンとの互換性を求める場合、pytzというサードパーティーライブラリを用いるのが一般的です。
pytzライブラリ
pytzライブラリは、IANAタイムゾーンデータベースを基にしたPythonのタイムゾーンライブラリです。このライブラリを使用すると、世界中のほぼすべてのタイムゾーンに関する詳細な情報を取得・操作することができます。
import pytz
from datetime import datetime
# Tokyoのタイムゾーンを取得
tokyo_tz = pytz.timezone('Asia/Tokyo')
# 現在のTokyoの時間を取得
tokyo_time = datetime.now(tokyo_tz)
print(tokyo_time)
サマータイムの対応
pytzを使えば、サマータイムが適用される地域においても正確な時刻を取得・操作することができます。
import pytz
# New Yorkのタイムゾーンを取得
ny_tz = pytz.timezone('America/New_York')
# 現在のNew Yorkの時間を取得
ny_time = datetime.now(ny_tz)
print(ny_time)
世界各地のタイムゾーンとの互換性
pytzでは、IANAタイムゾーンデータベースに基づいているため、世界中の多くのタイムゾーンに対応しています。したがって、国際的なアプリケーションやサービスを開発する際には、pytzを使用してタイムゾーンを取り扱うと便利です。
import pytz
# 利用可能なタイムゾーンの一覧を取得
available_timezones = pytz.all_timezones
print(available_timezones)
timeモジュール
Pythonのtimeモジュールは、時間に関連するさまざまな関数を提供するモジュールです。このモジュールを使用すると、UNIXエポックからの経過秒数の取得や待機、時刻のフォーマット変換などの基本的な時間操作を行うことができます。
現在のエポック秒の取得
UNIXエポック(1970年1月1日 00:00:00 UTC)からの経過秒数を取得します。
import time
seconds_since_epoch = time.time()
print(seconds_since_epoch) # 例:1625369539.482287
プログラムの実行を一時停止
指定された秒数だけプログラムの実行を停止します。小数点以下の秒数も指定できます。
import time
print("Start")
time.sleep(2) # 2秒間待機
print("End")
ローカルタイムへの変換
エポック秒を、ローカルタイムのstruct_time形式に変換します。
import time
local_time = time.localtime()
print(local_time)
# 例:time.struct_time(tm_year=2021, tm_mon=7, tm_mday=4, ... )
UTCへの変換
エポック秒を、UTCのstruct_time形式に変換します。
import time
utc_time = time.gmtime()
print(utc_time)
時間のフォーマット
struct_timeを、指定したフォーマットの文字列に変換します。
import time
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", local_time)
print(formatted_time) # 例:"2021-07-04 12:32:19"
文字列から時間への変換
時間を表す文字列を、struct_time形式に変換します。
import time
time_string = "2021-07-04 12:32:19"
parsed_time = time.strptime(time_string, "%Y-%m-%d %H:%M:%S")
print(parsed_time)
struct_timeからエポック秒への変換
struct_time形式の時間を、エポック秒に変換します。
import time
seconds = time.mktime(parsed_time)
print(seconds) # 例:1625369539.0
calendarモジュール
Pythonのcalendarモジュールは、カレンダー関連の操作をサポートするモジュールです。このモジュールを使用することで、特定の月や年のカレンダーをテキストで出力したり、特定の月に含まれる日数を取得したりすることができます。
カレンダーの出力
指定した年のカレンダーをテキストで取得します。
import calendar
print(calendar.calendar(2023))
月のカレンダーを出力
指定した年と月のカレンダーをテキストで取得します。
import calendar
print(calendar.month(2023, 7))
週の最初の曜日を取得/設定
週の最初の曜日(デフォルトは月曜日)を取得または設定します。
import calendar
print(calendar.firstweekday()) # 0: 月曜日
calendar.setfirstweekday(calendar.SUNDAY)
print(calendar.firstweekday()) # 6: 日曜日
曜日の取得
指定した年、月、日の曜日を取得します。0が月曜日、6が日曜日を示します。
import calendar
print(calendar.weekday(2023, 7, 7)) # 4: 金曜日
うるう年の確認
指定した年がうるう年かどうかを確認します。
import calendar
print(calendar.isleap(2020)) # True
print(calendar.isleap(2023)) # False
うるう年の数を取得
指定した年間におけるうるう年の数を取得します。
import calendar
print(calendar.leapdays(2000, 2024)) # 6
月の日数と最初の曜日を取得
指定した年と月の最初の曜日(0:月曜日 - 6:日曜日)とその月の日数を取得します。
import calendar
weekday, days_in_month = calendar.monthrange(2023, 2)
print(weekday, days_in_month) # 2 28
練習問題1.
今日の日付と2022年12月25日との間の日数を計算してください。
練習問題2.
今日から100日後は何曜日になるかを計算してください。
練習問題3.
現在のUTC時間を"YYYY-MM-DD HH:MM:SS"のフォーマットで表示してください。