この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。
前回はdatetimeモジュールの応用方法について学びました。datetimeモジュールには便利な機能があります。
今回は、日時データの計算について見ていきたいと思います。日付や時間の計算は重要ですが、少し癖がありますよね。
日時の差分
2つの日時の差や、所定の日時から指定日数(時間)経過した日時を取得したいことが良くあります。2つのdatetimeオブジェクトの差分はどんな結果になるのでしょうか。試してみました。
dt_1 = datetime.datetime(2024,8,30,15,7,30) dt_2 = datetime.datetime(2024,9,1,14,15,20) print(dt_2 - dt_1) # 1 day, 23:07:50 を返す print(type(dt_2 - dt_1)) # <class 'datetime.timedelta'> を返す
2つのdatetimeオブジェクトの日数差と、残りの時間差が表示されました。データ型については「timedelta」となっています。2つのdatetimeオブジェクトの差は、timedelta型(timedeltaオブジェクト)で表されます。また、2つのdateオブジェクトの差も、timedelta型で表されます。datetimeオブジェクトとdateオブジェクトの差は、求められません。型変換して型をそろえる必要があります。
timedeltaオブジェクト
この様に2つの日時の差は、timedeltaオブジェクトで表します。timedeltaオブジェクトは、datetimeモジュールの「timedeltaクラス」で作成します。また上にご紹介した通り、datetimeオブジェクト同士の差でもtimedeltaオブジェクトが作成されます。これはdatetimeクラス内で特殊メソッド(sub)が定義されているからです。
timedeltaオブジェクト作成の記述は以下になります。
datetime.timedelta(日数,秒,マイクロ秒,ミリ秒,分,時間,週)
すべての引数は省略可能で省略すると0になります。モジュール内では以下のように定義されています。
def __new__(cls, days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0):
日時の加算、減算
timedeltaオブジェクトを使用すれば、日時データに加算、減算ができます。10日前の日付、15時間後の日時などです。
dt = datetime.datetime(2024,8,30,15,7,30) td = datetime.timedelta(days=1,seconds=1,weeks=2 ) print(dt) # 2024-08-30 15:07:30 を返す print(dt + td) # 2024-09-14 15:07:31 を返す print(dt - td) # 2024-08-15 15:07:29 を返す
各要素の取り出し
timedeltaオブジェクトは、「1 day, 23:07:50」のような形式でデータを返すので、数値との計算に直接使えません。計算する場合は各要素を取り出して使います。取り出しにはdaysメソッド、secondsメソッド、microsecondsメソッドを使用します。
td = datetime.timedelta(days=1,seconds=1,weeks=2,microseconds=5) print(td.days) # 15(日数)を返す print(td.seconds) # 1(秒数)を返す print(td.microseconds) # 5(マイクロ秒数)を返す
月初、月末の日付の取得
プログラミングしていると、月初、月末の日付を取得したいことがあります。月初は必ず1日になるので問題ないのですが、月末は決まっていないので困ります。timedeltaを使うとこの様な問題も解決できます。指定年月の月末日を取得する関数を作ってみました。
# 指定年月の月末日を取得する def get_lastdate(y, m): # 指定年月の月初を取得 dt_1 = datetime.datetime(y,m,1) # 31日足して翌月の日時データを作成 dt_2 = dt_1 + datetime.timedelta(days=31) # 翌月の月初を取得 dt_3 = datetime.datetime(dt_2.year,dt_2.month ,1) # 1日引いて指定年月の月末日を取得 return dt_3 - datetime.timedelta(days=1) print(get_lastdate(2024,11)) # 2024-11-30 00:00:00 を返す
次回はカレンダー
いかがでしょうか。timedeltaオブジェクトを使いこなせば日時データの処理が楽になりますね。次回はカレンダーです。日付の取り扱いがさらに手軽になります。お楽しみに!!