最初に
機械学習やデータ分析で、特定の期間にデータを絞りたいなという時があると思います。
アドホックに絞る場合はPySparkや素のSQLで簡単に絞れますが、これを自動で、動的に絞りたいときはどうするか?
ということで、コーディングしてみました。
ゴール
「プログラムを実行する日」を起点として、「その前月の最終日」から「3ヶ月前の月の初日」の2つを取得したいと思います。
流れ
「プログラムを実行する日」を取得する
つまり本日のdatetimeを取得します。
from datetime import date
current_datetime = date.today()
print(current_datetime)
>>> 2022-10-02
「その前月の最終日」を取得する
プログラム実行日の前月データ
relativedeltaメソッドを使います。
from dateutil.relativedelta import relativedelta
one_month_ago_datetime = current_datetime - relativedelta(months=1)
print(one_month_ago_datetime)
>>> 2022-09-02
前月の最終日
月の最終日とは、その月の日数に等しいので、それから取ります。
import calendar
target_end_datetime = get_last_date(one_month_ago)
print(target_end_date)
>>> 2022-09-30
参考にさせていただきました。
##「3ヶ月前の月の初日」を取得する
まともにやるとダメ
まともに考えると、上のtarget_end_datetimeから、relativedeltaで3を引けばいいのですが、これをすると
three_month_ago_datetime = target_end_datetime - relativedelta(months=3)
print(three_month_ago_datetime)
>>> 2022-06-30
となるので、欲しい「2022-07-01」とは若干異なりますね。
確実性を保つために、別の方法を試します。
「2ヶ月前の月の初日」を取ることにする
まず2ヶ月前のdatetimeを取って、
two_month_ago_datetime = target_end_datetime - relativedelta(months=2)
print(two_month_ago_datetime)
>>> 2022-07-30
この月の初日を取ることにします。
target_first_datetime = two_month_ago_datetime.replace(day=1)
print(target_first_datetime)
>>> 2022-07-01
これで出来ました。
元データがただの文字列だったら?
元データがただの文字列(yyyyMMdd)であれば、これを一旦datetime型に直して上のコードを使う必要があります。