Pythonのtimedeltaを使って時間の足し算、引き算、日付の合計の秒数等を計算する方法

スポンサーリンク

今日の記事では、Pythonのtimedeltaオブジェクトの使い方について見ていきます。

このオブジェクトは、時間のインスタンスをオブジェクトとして表現したい場合に、とても便利です。

整数や浮動小数点数とは対照的に、これは実際のオブジェクトです。

このオブジェクトの利点は、アプリケーションとの統合をより柔軟に行えるようになることです。

それでは、いくつかの簡単な例を使って、これをどのように使うか見てみましょう。

スポンサーリンク

Python timedelta オブジェクト

このクラスは標準ライブラリの一部である datetime モジュールで利用できます。

from datetime import timedelta

このクラスのコンストラクタを使用して timedelta オブジェクトを作成できます。

from datetime import timedelta
 
timedelta_object = timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
print(timedelta_object)
 
# Same as above (Everything set to 0)
zero_obj = timedelta()
print(zero_obj)

結果は以下の通りです。

0:00:00
0:00:00

パラメータをカスタマイズして、独自のdatetimeオブジェクトを作ることができることに注意してください。

引数の値を設定しない場合、デフォルトで0とみなされます。

引数は整数または浮動小数点数で、正負の値を設定できます。

Python の既存のタイムデルタオブジェクトを操作する

独自のタイムデルタオブジェクトを作成する以外に、既存のタイムデルタオブジェクトを操作することもできます。

基本的な演算子を使って、2つのタイムデルタオブジェクトを足したり、引いたり、割ったりすることができます

a = timedelta(hours=4, seconds=100)
print(a)
b = timedelta(hours=2, seconds=50)
print(b)
print("Output:")
print(a + b, a - b, a / b, sep='
'
)

結果は以下の通りです。

4:01:40
2:00:50
Output:
6:02:30
2:00:50
2.0

このように、簡単な操作でオブジェクトを直接操作することができます

現在のdatetimeオブジェクトを取得する

さて、実際のプログラムでは、ほとんどの場合、現在の時刻を使用して、それをdatetimeオブジェクトとして保存したいと思うでしょう。

datetime.now()関数を使えば、現在の時刻をdatetimeオブジェクトとして表示することができます!


この関数はモジュール名から個別にインポートする必要があることに注意してください!

from datetime import datetime

では、例を見てみましょう。

from datetime import datetime
 
current_datetime = datetime.now()
print(current_datetime)

結果は以下の通りです。

datetime.datetime(2020, 6, 27, 22, 45, 54, 267673)

出力は一致しているようです! 現在の時刻は、私のローカルタイムゾーン(IST)で2020年6月27日22時45分54秒と表示されています。

さて、基本的な演算子を使って、過去や未来の時刻を取得することもできます

from datetime import datetime, timedelta
 
current_datetime = datetime.now()
 
# future dates
one_year_future_date = current_datetime + timedelta(days=365)
 
print('Current Date:', current_datetime)
print('One year from now Date:', one_year_future_date)
 
# past dates
three_days_before_date = current_datetime - timedelta(days=3)
print('Three days before Date:', three_days_before_date)

結果は以下の通りです。

Current Date: 2020-06-27 22:45:54.267673
One year from now Date: 2021-06-27 22:45:54.267673
Three days before Date: 2020-06-24 22:45:54.267673

Python の timedelta を使って日付と時刻を指定する

Python timedelta クラスを日付オブジェクトと一緒に、加算と減算を使って使用することもできます。

from datetime import datetime, timedelta
 
current_datetime = datetime.now()
 
dt = current_datetime.date()
print('Current Date:', dt)
dt_tomorrow = dt + timedelta(days=1)
print('Tomorrow Date:', dt_tomorrow)

結果は以下の通りです。

Current Date: 2020-06-27
Tomorrow Date: 2020-06-28

これは、タイムスタンプを保存/表示しようとするときに、より柔軟性を与えます。

もし、最小限のフォーマットでタイムスタンプを表示したいのであれば、 datetime_object.date() を使うのが良い選択です。

Python timedelta 合計秒数

を使って、任意のtimedeltaオブジェクトの合計秒数を表示することができます

from datetime import timedelta
 
print('Seconds in an year:', timedelta(days=365).total_seconds())

結果は以下の通りです。

Output: Seconds in an year: 31536000.0

特定のタイムゾーンのためのdatetimeオブジェクトを使用する

datetimeオブジェクトを保存したり表示したりするときに、異なるタイムゾーンを使いたい場合があるかもしれません。

Pythonでは、 pytz モジュール (Python Timezones) を使用して、これを行う便利な方法が用意されています。

まだインストールしていない場合は、 pip を使用して pytz をインストールすることができます

pip install pytz

それでは、 pytz.timezone(TIMEZONE) を使用してタイムゾーンを選択し、それを timedelta オブジェクトに渡すことができます。

以下は、同じ時刻を異なるタイムゾーンで表示する簡単な例です。

便利なヒント: pytz.common_timezones を使用すると、一般的なタイムゾーンをリストアップすることができます

from datetime import datetime
from pytz import timezone, common_timezones
 
datetime_object = datetime.now(timezone('Asia/Kolkata'))
print("Current IST:", datetime_object)

結果は以下の通りです。

Current IST: 2020-06-27 23:27:49.003020+05:30
from datetime import datetime
from pytz import timezone, common_timezones
import random
 
for _ in range(4):
    zone = random.choice(common_timezones)
    print(f"Using TimeZone: {zone}")
    datetime_object = datetime.now(timezone(zone))
    print(datetime_object)

結果は以下の通りです。

Using TimeZone: America/St_Lucia
2020-06-27 13:57:04.804959-04:00
Using TimeZone: Asia/Muscat
2020-06-27 21:57:04.814959+04:00
Using TimeZone: Asia/Urumqi
2020-06-27 23:57:04.825990+06:00
Using TimeZone: Asia/Seoul
2020-06-28 02:57:04.836994+09:00

確かに、異なるタイムゾーンでの現在時刻を取得することができました

まとめ

今回は、timedeltaオブジェクトを使ってPythonのオブジェクトとして時間を表現する方法を学びました!

参考文献

  • Python timedelta に関する JournalDev の記事。
タイトルとURLをコピーしました