Pythonで日時を扱う¶
標準ライブラリ¶
UNIX時間(1970年1月1日を起点とする通算秒数)を扱うtimeモジュールと、タイムゾーン、ISO8601表現形式や日時の計算も扱うdatetimeモジュールがあります。
datetimeパッケージ¶
naiveとaware¶
datetimeは日時を表現する型で、日時およびタイムゾーン情報を保持します。日時とタイムゾーン情報ともに設定されたdatetimeをawareと呼び、日時のみでタイムゾーン情報を持たないdatetiemをnaiveと呼びます。
naive¶
from datetime import datetime
dt = datetime.now()
このプログラムを実行しているシステムのタイムゾーンにおける現在日時を取得します。日本語環境(タイムゾーンが"Asia/Tokyo")で2026-05-29T21:30:00+09:00 に実行すると、2026-05-29 21:30:00.055941 と日本時間でタイムゾーン情報を持たないオブジェクトが生成されます。
一方、システムのタイムゾーンが太平洋時刻('PDT')で同じタイミングで実行すると、2026-05-29 05:30:00.055941 と太平洋時間でタイムゾーン情報を持たないオブジェクトが生成されます。
navieなdatetimeは、タイムゾーン情報を持たないので、年月日時分秒をどのタイムゾーンとして扱うかをプログラム外で決めておく必要があります。
aware¶
from datetime import datetime
from zoneinfo import ZoneInfo
JST = ZoneInfo("Asia/Tokyo")
dt = datetime.now(JST)
このプログラムを日本時間の2026-05-29T21:30:00+09:00に実施するとシステムのタイムゾーンによらず、datetime(2026-05-29 21:30:00.000000+09:00)と指定したタイムゾーン情報を持つ日時が生成されます。
naiveからawareへ¶
naiveなdatetiemをタイムゾーンを持つawaeなdatetimeに変換するときは、次の2つのメソッドのいずれか、または双方を利用します。
- astimezone
- replace
astimezone¶
naiveなdatetimeに対してastimezoneを呼び出すと、datetimeの日時がシステムのタイムゾーンでの日時であるとみなし、その日時を引数で指定したタイムゾーンに変換します。システムのタイムゾーンと指定したタイムゾーンが異なる場合、naiveなdatetimeの日時の値が変化します。
from datetime import datetime
from zoneinfo import ZoneInfo
dt_naive = datetime(2026,5,30,3,0,0)
JST = ZoneInfo("Asia/Tokyo")
dt_aware = dt_naive.astimezone(JST)
システムのタイムゾーンが日本時間の場合、2026-05-30 03:00:00+09:00 となります。
システムのタイムゾーンがUTCの場合、2026-05-30 12:00:00+09:00 となります。
replace¶
naiveなdatetimeに対してreplaceメソッドを呼び出すと、datetimeの日時の値はそのままに引数で指定したタイムゾーン情報が付加されます。
from datetime import datetime
from zoneinfo import ZoneInfo
dt_naive = datetime(2026,5,30,3,0,0)
JST = ZoneInfo("Asia/Tokyo")
dt_aware = dt_naive.replace(tzinfo=JST)
システムのタイムゾーンにかかわらず2026-05-30 03:00:00+09:00となり、naiveなdatetimeが持つ日時の値はそのままで指定したタイムゾーン情報を設定します。
文字列から日時へ¶
ISO8601形式文字列から日時へ¶
datetime.fromisoformat()関数を使います。
from datetime import datetime
t = datetime.fromisoformat("2024-12-25T23:45:01")
tz = datetime.fromisoformat("2024-12-25T23:45:01Z")
tj = datetime.fromisoformat("2024-12-25T23:45:01+09:00")
- tはタイムゾーン(時刻帯)が未指定のため、naiveオブジェクトとなる
- tz, tjはタイムゾーン(時刻帯)を指定しているため、awareオブジェクトとなる
その他の文字列から日時へ¶
datetime.strptime()関数を使います。
from datetime import datetime
t = datetime.strptime("2024/12/25 23:45", "%Y/%m/%d %H:%M")
tz = datetime.strptime("2024/12/25 23:45Z", "%Y/%m/%d %H:%M%z")
- strptime関数には、tzinfoを受け取る引数がないので、時刻帯を指定するには、文字列の末尾に時刻帯の情報を付けることで対処
日時から文字列へ¶
datetimeのisoformatメソッドを使って、ISO8601形式の文字列化をします。
from datetime import datetime, UTC
t = datetime(2024,12,25,23,45, tzinfo=UTC)
print(t.isoformat()) # 2024-12-25T23:45:00+00:00
任意の形式で文字列化¶
datetimeのstrftimeメソッドを使って、任意に定義する形式で文字列化します。
from datetime import datetime, UTC
t = datetime(2024,12,25,23,45, tzinfo=UTC)
print(t.strftime("%Y/%m/%d %H:%M:%S")) # 2024/12/25 23:45:00
日時の取得¶
今の日付・時刻¶
from datetime import datetime
today = datetime.date.today() # 実行する環境のタイムゾーンにおける年月日取得
now = datetime.now() # 実行する環境のタイムゾーンにおける年月日時分秒を取得
UTC時刻での取得
from datetime import datetime, UTC
now = datetime.now(UTC)
- datetime.UTCは、Python 3.11で追加された、datetime.timezone.utcのエイリアス
UNIX時刻から日時¶
from datetime import datetime, UTC
time = datetime.fromtimestamp(0) # 実行する環境のタイムゾーンにおける年月日時分秒(例えばJSTでは:1970,1,1,9,0,0)
time = datetime.fromtimestamp(0, UTC) # UTCでの年月日時分秒 1970,1,1,0,0,0
- utcfromtimestamp関数は deprecated となっている
日時からUNIX時刻¶
from datetime import datetime, UTC
utime = datetime(2024, 2, 14, 12, 30, 45, tzinfo=UTC).timestamp()
日時と日付・時刻の変換¶
時刻(time)から日時(datetime)へ¶
- combine
from datetime import date, datetime, time
today = date.today()
noon = time(12,0,0)
noon_today = datetime.combine(today, noon)
年間通算日¶
datetime から年間通算日への変換¶
from datetime import datetime
dt = datetime(2023, 3, 19, 4, 0, 0) # 2023-03-19T04:00:00Z
print(dt.strftime("%j"))
078 と表示されます。
date から年間通算日への変換¶
import datetime
day = datetime.date(2023, 3, 19) # 2023-03-19
print(day.strftime("%j"))
078 と表示されます。
年間通算日から datetime への変換¶
datetimeモジュールでは、ISO8601表現形式の年間通算日(ordinal date)形式 "YYYY-DDD" に対応していないので、書式を明示的に指定します。
import datetime
datetime.datetime.strptime('2023-078', "%Y-%j") # datetime(2023, 3, 19, 0, 0)
toordinalメソッドについて¶
datetimeおよびtimeクラスにはtoordinalメソッドが用意されていますが、これは西暦1年1月1日を起点とする通算日数を返すので、その年の年間通算日にはなりません。
比較¶
日時同士の比較¶
- datetime型の変数は、比較演算子で日時の比較ができる