本記事では、日付の加算・減算に使うrelativedeltaについて解説します。
標準ライブラリであるtimedeltaと同じような機能ですが、timedeltaとの違いは月・年の加算ができることです。
relativedeltaを用いた日付の計算・取得
日付データを含んだデータセットを扱うデータ分析では、時刻や日だけでなく、月や年ごとの集計を行う機会もあります。前述の通り、timedeltaでは、月や年単位を引数として扱うことができないため、必要に応じてrelativedeltaを用います。
relativedeltaのインポート
それでは、ライブラリのインポートから行っていきます。
import datetime
from dateutil.relativedelta import relativedelta
日付+relativedelta(months=1)
とすることで1ヶ月加算することができます。
datetime.datetime(2022, 1, 1) +relativedelta(months=+1)
#datetime.datetime(2022, 2, 1, 0, 0)
同様に一年後の日付も取得できます。
datetime.datetime(2022, 1, 20)+ relativedelta(years=+1)
#datetime.datetime(2023, 1, 20, 0, 0)
次は月初日を取得する方法です。relativedeltaの引数にday=1と指定するだけです。
datetime.datetime(2022, 1, 20) +relativedelta(day=1)
#datetime.datetime(2022, 1, 1, 0, 0)
これを次のように使うと月末日を簡単に取得できるようになります。
datetime.datetime(2022, 1, 20) +relativedelta(months=+1,day=1,days=-1)
#datetime.datetime(2022, 1, 31, 0, 0)
元の日付に1カ月を足し、day=1で月初日とし、最後に1日を引くことで月末日を得ることができます。
ただ、もっと簡単な方法があります。引数で31と指定します。
datetime.datetime(2022, 1, 20) +relativedelta(day=31)
「31日まである月だから”day=31”にしなければいけない」という訳ではないところが便利な点です。例えば28日までしかない二月でも同じ要領で月末日を得ることができます。
datetime.datetime(2022, 2, 20) +relativedelta(day=31)
#datetime.datetime(2022, 2, 28, 0, 0)
曜日などのカレンダー情報を取得する
次は曜日に着目していきます。
最初にcalendarライブラリをインポートし、relativedeltaと組み合わせることで簡単に曜日を考慮した日付を取得できます。
まずは、calendarライブラリとmonth()を使って、シンプルなカレンダーを表示してみます。
ちなみにmonth()は、年と月を引数で渡せば、その月のカレンダーを文字列として返してくれる関数です。
import calendar
calendar.month(2022, 1)
# January 2022
#Mo Tu We Th Fr Sa Su
# 1 2
# 3 4 5 6 7 8 9
#10 11 12 13 14 15 16
#17 18 19 20 21 22 23
#24 25 26 27 28 29 30
#31
次の金曜日を得るには次のように記述します。2022年の1月20日は木曜日です。
import calendar
datetime.datetime(2022, 1, 20) +relativedelta(weekday=calendar.FRIDAY)
#datetime.datetime(2022, 1, 21, 0, 0)
正しく次の金曜日が得られますね。