こんにちは!TodoONadaの土門(@daikidomon)です。
datetimeオブジェクトもtimedeltaについて紹介したいと集中的に紹介したいと思います。
日付や日時の加算・減算に利用することが出来ますので、その方法を詳しく紹介します。
またその他特別な演算方法についても紹介します。
Contents
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