Python で日時を扱う際に datetime オブジェクトを用いると、オブジェクト同士の比較や、時差を考慮することができるようになるので大変便利です。日付を表現した文字列から datetime に変換するサンプルは数多く見つけることができましたが、イチから作成する方法はあまり紹介されていないようだったので紹介します。
環境:Python 3.9
Python datetime について
まずは、Python における日時オブジェクトである datetime について簡単に触れていきます。
Python における日時オブジェクトである datetime は、Aware と Naive という2つに分類されます。
- Aware: タイムゾーンなどの付加情報をもつため、解釈の余地のない特定の実時刻を表現
- Naive: タイムゾーンなどの付加情報をもたないため、多少曖昧ともいえる時刻を表現
また、datetime で取り扱うことができる型は以下の通りです。
- date 日付:年、月、日からなる日付
- time 時刻:時、分、秒、ミリ秒、 tzinfo からなる時刻
- datetime 日付+時刻:date と time を組み合わせたもの
- timedelta 時間差(経過時間): date, time, datetime について、2つのインスタンス間の時間差
- tzinfo タイムゾーン情報: datetime, time で用いるタイムゾーン情報
- timezone タイムゾーン:tzinfo に基づいた時刻を UTC からのオフセットとして実装
厳密な時刻を扱う必要がない場合は、 Naive が簡素に扱えそうです。ここでは、Aware か Naive かを意識して日時オブジェクトを作成していきます。
datetime オブジェクトの作成
それでは、実際に datetime オブジェクトを作成していきます。まずは、より簡単に作成することができる Naive から始めます。対話型 Python を使ってすすめていきます。
時差を意識しない Naive オブジェクトの作成
対話型 Python を起動します。
% python Python 3.9.6 (default, Jun 29 2021, 05:25:02) [Clang 12.0.5 (clang-1205.0.22.9)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
年、月、日 を指定して作成してみます。
>>> from datetime import datetime, timedelta, timezone >>> dateTime = datetime(year=2021, month=7, day=23) >>> >>> type(dateTime) <class 'datetime.datetime'> >>> >>> print(dateTime) 2021-07-23 00:00:00
次に、年月日に加え、時分秒まで指定してみます。
>>> dateTime = datetime(year=2021, month=7, day=23, hour=20, minute=25, second=55) >>> >>> type(dateTime) <class 'datetime.datetime'> >>> >>> print(dateTime) 2021-07-23 20:25:55
なお、時分秒ミリ秒は省略可能で省略するとゼロとして扱われますが、年月日は省略不可となります。
続いて、より正確な日時を表す Aware オブジェクトを作成していきます。
時差を意識した Aware オブジェクトの作成
Aware オブジェクトを作成するためには、 tzinfo を指定して作成する必要があります。まずは、 UTC で作成してみます。
>>> dateTime = datetime(year=2021, month=7, day=23, hour=20, minute=25, second=55, tzinfo=timezone.utc) >>> >>> type(dateTime) <class 'datetime.datetime'> >>> >>> print(dateTime) 2021-07-23 20:25:55+00:00
次に、同じ時刻を JST として作成してみます。JST として作成するためには、datetime のサブクラスである timezone を使って JST を表現する必要があります。以下にあるように、UTC からの固定の時差を指定することで表現することができます。用途に応じて timezone の作成方法に違いがあります。ここでは、後者の方法で進めていきます。
https://docs.python.org/ja/3/library/datetime.html#timezone-objects
timezone
クラスはtzinfo
のサブクラスで、各インスタンスは UTC からの固定されたオフセットで定義されたタイムゾーンを表しています。
時差のみを使って JST を表現
>>> tzInfo = timezone(timedelta(hours=+9)) >>> >>> type(tzInfo) <class 'datetime.timezone'> >>> >>> print(tzInfo) UTC+09:00
時差+識別子 “JST” を使って JST を表現し、 datetime を作成
>>> tzInfo = timezone(timedelta(hours=+9), 'JST') >>> >>> type(tzInfo) <class 'datetime.timezone'> >>> >>> print(tzInfo) JST >>> dateTime = datetime(year=2021, month=7, day=23, hour=20, minute=25, second=55, tzinfo=tzInfo) >>> >>> type(dateTime) <class 'datetime.datetime'> >>> >>> print(dateTime) 2021-07-23 20:25:55+09:00
Aware オブジェクトの場合、時刻の最後にタイムゾーンを表す部分が追加になっていることがわかります。
まとめ
- datetime オブジェクトには、時差を考慮した Aware と、時差を考慮しない簡易的な Naive がある
- 時分秒ミリ秒は省略可。省略するとゼロとして扱われる。
- datetime オブジェクト作成時に、 tzinfo を指定すると、 Aware 指定しないと Naive となる
- timezone は UTC からの差分を指定することで表現する
次回は、作成した datetime オブジェクトを活用する方法を扱ってみたいと思います。