今日の記事では、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のpytzモジュールを使ってタイムゾーンを変更する方法
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 の記事。