Python バックエンド プログラム言語

Pythonとtimedeltaで日付・日時の加算と減算。比較演算子や商・剰余の利用方法を紹介

こんにちは!TodoONadaの土門(@daikidomon)です。

datetimeオブジェクトもtimedeltaについて紹介したいと集中的に紹介したいと思います。

日付や日時の加算・減算に利用することが出来ますので、その方法を詳しく紹介します。

またその他特別な演算方法についても紹介します。

参考timedelta オブジェクト

timedeltaの基本

timedelta オブジェクトは経過時間、すなわち二つの日付や時刻間の差を表すことができます。

from datetime import timedelta

timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

以下がサンプルになります。

from datetime import timedelta

time_one  = timedelta(days=1,hours=12,weeks=1,minutes=30)

print(time_one)
# 8 days, 12:30:00

timedeltaはtimedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)があるのですが、

timedeltaオブジェクトが内部に保持しているのは引数で指定された週や時間の値から換算された日数、秒数、マイクロ秒数のみなので、

days,seconds,microsecondsしかアクセスできません。

範囲は以下になります。

  • microseconds :[0,1000000]
  • seconds:[0, 3600*24]
  • days:[-999999999,999999999]

加算してdatedelta内の時間を進める(〇年後、〇日後、〇時間後、〇分後、〇秒後...)

timedeltaを加算することで、datetimeオブジェクトの時間を進めることが出来ます。

サンプルは以下になります。

from datetime import datetime,timedelta

date_obj = datetime(2020,5,20,12)

time_week = timedelta(weeks=1)
time_days = timedelta(days=1) 
time_hours = timedelta(hours=1)
time_minutes = timedelta(minutes=30)
time_seconds = timedelta(seconds = 300)
time_milliseconds = timedelta(milliseconds=3*10**4)
time_microseconds = timedelta(microseconds=3*10**7)

print("datetimeオブジェクト(2020年5月20日 12時):", date_obj)
# datetimeオブジェクト(2020年5月20日 12時): 2020-05-20 12:00:00

print("datetimeオブジェクト(2020年5月20日 12時)から一週間後:", date_obj + time_week)
# datetimeオブジェクト(2020年5月20日 12時)から一週間後: 2020-05-27 12:00:00

print("datetimeオブジェクト(2020年5月20日 12時)から一日後:", date_obj + time_days)
# datetimeオブジェクト(2020年5月20日 12時)から一日後: 2020-05-21 12:00:00

print("datetimeオブジェクト(2020年5月20日 12時)から一時間後:", date_obj + time_hours)
# datetimeオブジェクト(2020年5月20日 12時)から一時間後: 2020-05-20 13:00:00

print("datetimeオブジェクト(2020年5月20日 12時)から30分後:", date_obj + time_minutes)
# datetimeオブジェクト(2020年5月20日 12時)から30分後: 2020-05-20 12:30:00

print("datetimeオブジェクト(2020年5月20日 12時)から300秒後:", date_obj + time_seconds)
# datetimeオブジェクト(2020年5月20日 12時)から300秒後: 2020-05-20 12:05:00

print("datetimeオブジェクト(2020年5月20日 12時)から30000ミリ秒後(30秒後):", date_obj + time_milliseconds)
# datetimeオブジェクト(2020年5月20日 12時)から30000ミリ秒後(30秒後): 2020-05-20 12:00:30

print("datetimeオブジェクト(2020年5月20日 12時)から30000000マイクロ秒後(30秒後):",date_obj + time_microseconds)
# datetimeオブジェクト(2020年5月20日 12時)から30000000マイクロ秒後(30秒後): 2020-05-20 12:00:30

減算してdatedelta内の時間を戻す(〇年前、〇日前、〇時間前、〇分前、〇秒後...)

timedeltaを減算することで、datetimeオブジェクトの時間を戻すことが出来ます。

サンプルは以下になります。

from datetime import datetime,timedelta

date_obj = datetime(2020,5,20,12)

time_week = timedelta(weeks=1)
time_days = timedelta(days=1) 
time_hours = timedelta(hours=1)
time_minutes = timedelta(minutes=30)
time_seconds = timedelta(seconds = 300)
time_milliseconds = timedelta(milliseconds=3*10**4)
time_microseconds = timedelta(microseconds=3*10**7)

print("datetimeオブジェクト(2020年5月20日 12時)から一週間前:", date_obj - time_week)
# datetimeオブジェクト(2020年5月20日 12時)から一週間前: 2020-05-13 12:00:00

print("datetimeオブジェクト(2020年5月20日 12時)から一日前:", date_obj - time_days)
# datetimeオブジェクト(2020年5月20日 12時)から一日前: 2020-05-19 12:00:00

print("datetimeオブジェクト(2020年5月20日 12時)から一時間前:", date_obj - time_hours)
# datetimeオブジェクト(2020年5月20日 12時)から一時間前: 2020-05-20 11:00:00

print("datetimeオブジェクト(2020年5月20日 12時)から30分前:", date_obj - time_minutes)
# datetimeオブジェクト(2020年5月20日 12時)から30分前: 2020-05-20 11:30:00

print("datetimeオブジェクト(2020年5月20日 12時)から300秒前:", date_obj - time_seconds)
# datetimeオブジェクト(2020年5月20日 12時)から300秒前: 2020-05-20 11:55:00

print("datetimeオブジェクト(2020年5月20日 12時)から30000ミリ秒前(30秒前):", date_obj - time_milliseconds)
# datetimeオブジェクト(2020年5月20日 12時)から30000ミリ秒前(30秒前): 2020-05-20 11:59:30

print("datetimeオブジェクト(2020年5月20日 12時)から30000000マイクロ秒前(30秒前):", date_obj - time_microseconds)
# datetimeオブジェクト(2020年5月20日 12時)から30000000マイクロ秒前(30秒前): 2020-05-20 11:59:30

timedeltaの比較

timedeltaオブジェクトも演算子を使用して比較することが可能です。

# 二つのtimedeltaオブジェクトの間に比較演算子を使います。
timedeltaオブジェクト1 比較演算子 timedeltaオブジェクト2

サンプルは以下になります。

from datetime import timedelta

time_one = timedelta(days=1,hours=12,weeks=1,minutes=30)
time_two = timedelta(days=2,hours=24,weeks=2,minutes=30)


print("time_one == time_two:", time_one == time_two)
# time_one == time_two: False

print("time_one != time_two:", time_one != time_two)
# time_one != time_two: True

print("time_one < time_two:", time_one < time_two)
# time_one < time_two: True

print("time_one > time_two:", time_one > time_two)
# time_one > time_two: False

print("time_one <= time_two:", time_one <= time_two)
# time_one<=time_two: True

print("time_one >= time_two:",time_one >= time_two)
# time_one>=time_two: False

timedeltaのその他の演算

timedelta型でも商と剰余計算や絶対値取得なども可能です。

# timedeltaオブジェクトの間に演算子を使います。
timedeltaオブジェクト1 演算子 timedeltaオブジェクト2/数字

# 商と剰余が計算されます
q,r = divmod(timedeltaオブジェクト1,timedeltaオブジェクト2)

# timedelta負数
-timedeltaオブジェクト

# 絶対値
abs(timedeltaオブジェクト)

サンプルは以下になります。

from datetime import timedelta

time_one = timedelta(days=2,hours=24,weeks=2,minutes=30)
time_two = timedelta(days=1,hours=12,weeks=1,minutes=30)

print("time_one + time_two:", time_one + time_two)
# time_one + time_two: 25 days, 13:00:00
print("time_one - time_two:", time_one - time_two)
# time_one-time_two: 8 days, 12:00:00

print("time_one * 3:", time_one * 3)
# time_one * 3: 51 days, 1:30:00

print("time_one / time_two:", time_one / time_two)
# time_one / time_two: 1.9975550122249388

print("time_one / 2:", time_one / 2)
# time_one / 2: 8 days, 12:15:00

print("time_one // 3:", time_one // 3)
# time_one // 3: 5 days, 16:10:00

print("time_one % 3:", time_one % time_two)
# time_one % 3: 8 days, 12:00:00

print("divmod(time_one, 3): quotient:",divmod(time_one,time_two)[0],"Remain:", divmod(time_one, time_two)[1])
# divmod(time_one, 3): quotient: 1 Remain: 8 days, 12:00:00

print("-time_one:", -time_one)
# -time_one: -18 days, 23:30:00

print("abs(time_one):", abs(time_one))
# abs(time_one): 17 days, 0:30:00

print("abs(-time_one):", abs(-time_one))
# abs(-time_one): 17 days, 0:30:0

 

関連記事

-Python, バックエンド, プログラム言語

Copyright© スタートアップIT企業社長のブログ , 2020 All Rights Reserved.