Pythonでdatetimeを扱うのも例外ではなく、datetimeを扱うのは少し大変で挑戦的なことです。
Pythonの組み込みモジュールである datetime
は、 date
, datetime
, time
, timezone
, timedelta
といったいくつかのクラスを導入し、Arrowなどの公式モジュールが抱える問題を解決するためにいくつかの外部ライブラリが生まれました。
このガイドでは、タイムゾーンに関連する問題を解決するための標準ライブラリであるpytzと、任意の2つのdatetimeオブジェクト間の差分を計算するために使用するdateutilに基づいて構築されたライブラリであるDeloreanで、時刻と日付の整流、変更、datetimeオブジェクトの切り詰めを実行する方法を見ていきます。
Deloreanのインストール 仮想環境の構築
Deloreanは、pip
経由でインストールすることができます。
一般に、仮想環境で作業することが推奨されます。
なぜなら、異なるプロジェクトで必要とされる依存関係を分離して整理することができるからです。
LinuxやMacOSで仮想環境を構築するには、以下のようにします。
$ python3 -m venv env
$ source env/bin/activate
$ python3 -m pip install delorean
または、Windowsでは、次のように実行します。
$ virtualenv env
$ .envScriptsctivate
$ python3 -m pip install delorean
タイムデルタで時間の足し算・引き算をしよう
timedeltaは 2 つの
datetime` オブジェクトの差を表し、マイクロ秒の分解能を持つ。
マイクロ秒、秒、分、時、日、週などの長さの時間を定義することができる。
これは日付に関する情報は含まず、継続時間のみを表します。
6月5日と6月10日の間の timedelta
は、5月5日と5月10日の間の timedelta
と同じで、5日間です。
これによって、 datetime
オブジェクトに時間の長さを足したり引いたりすることがとても簡単になります。
from delorean import Delorean
import datetime
dt_tm_future = Delorean()
dt_tm_future += datetime.timedelta(days=3)
dt_tm_past = Delorean()
dt_tm_past -= datetime.timedelta(weeks=3)
print("The date 3 days from now is: ", dt_tm_future)
print("The date 3 weeks before now was: ", dt_tm_past)
この結果
The date 3 days from now is: Delorean(datetime=datetime.datetime(2021, 7, 17, 10, 22, 51, 403546), timezone='UTC')
The date 3 weeks before now was: Delorean(datetime=datetime.datetime(2021, 6, 23, 10, 22, 51, 403643), timezone='UTC')
Deloreanで日付間の日数を取得する
複数の日付がある場合によくある不明な点は、与えられた2つの日付の間の日数です。
この結果は、この差を表すために設計された timedelta
オブジェクトに通常格納されます。
日付に timedelta
を足したり引いたりするのがとても簡単なので、この操作も簡単なのは当然です。
PythonでDeloreanを使って2つの日付の間の日数を得るには、日付を引き算するだけで、その差分を timedelta
として表現することができます。
present_date = Delorean()
new_year = Delorean(datetime=datetime.datetime(2022, 1, 1), timezone='UTC')
until_new_year = new_year - present_date
print("Days until 2022 ", until_new_year)
print("Days till 2022 ", until_new_year.days)
その結果、差分を表す timedelta
が生成されます:“`
Days until 2022 170 days, 13:24:22.817417
Days till 2022 170
``です。
timedelta オブジェクト全体を表示することも、days
属性だけにアクセスすることもできます。
from delorean import Delorean
date = Delorean(datetime=datetime.datetime(2021, 5, 14, 12), timezone='Europe/Paris')
altered_tm = date.replace(hour=10)
altered_dt = date.replace(month=10)
print("Altered time is:", altered_tm)
print("Altered date is:", altered_dt)
altered_dt.shift('US/Pacific')
print("Shifted object:", altered_dt)
時刻と日付の変更
Deloreanでは、値を置き換えたりずらしたりすることで、簡単に日付オブジェクトを変更することができます。
そのために、 replace()
メソッドと shift()
メソッドを使用します。
replace()メソッドは、datetimeインスタンスのある部分を置き換えることができ、
shift()` はタイムゾーンを移動させることができます。
Altered time is: Delorean(datetime=datetime.datetime(2021, 5, 14, 10, 0), timezone='Europe/Paris')
Altered date is: Delorean(datetime=datetime.datetime(2021, 10, 14, 12, 0), timezone='Europe/Paris')
Shifted object: Delorean(datetime=datetime.datetime(2021, 10, 14, 3, 0), timezone='US/Pacific')
Deloreanインスタンスを作成し、その
hourと
month` 属性を変更し、そして変更された新しい datetime オブジェクトを新しいタイムゾーンにシフトしています。
from delorean import Delorean
date = Delorean()
print("Date before truncation:", date)
trun_min = date.truncate('minute') # Truncate to minutes
print("Truncated to minutes = ", trun_min)
DeloreanによるDatetimeオブジェクトの切り捨て
datetimeを使用する目的によっては、秒やミリ秒などの細かい単位は気にしないかもしれません。
計測値を除いたデータを単純に出力することもできますが、Deloreanオブジェクト自体から計測値を
truncate()` することもできます。
このメソッドは高次の計測値でも動作し、year
までの有効なデロリアンの時間枠をすべて受け入れることができます。
Date before truncation: Delorean(datetime=datetime.datetime(2021, 7, 14, 10, 52, 9, 893770), timezone='UTC')
Truncated to minutes = Delorean(datetime=datetime.datetime(2021, 7, 14, 10, 52), timezone='UTC')
注目すべきは、ある測定レベルまで切り捨てていることです。
つまり、分単位で切り捨てた場合、秒やミリ秒は切り捨てられます。
要するに、Delorean
インスタンスの解像度を設定しているのです。
偽コード
結論
このガイドでは、PythonでDeloreanを使って時刻や日付の演算、変更、切り捨てを行う方法について見てきました。