日付と時間_3(Python_34)

この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は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オブジェクトを使いこなせば日時データの処理が楽になりますね。次回はカレンダーです。日付の取り扱いがさらに手軽になります。お楽しみに!!

hirocom777.hatenadiary.org

Python再学習のまとめはこちら!!