LoginSignup
0
0

More than 1 year has passed since last update.

pythonで前月の最終日からNヶ月前の初日にデータを区切る

Posted at

最初に

機械学習やデータ分析で、特定の期間にデータを絞りたいなという時があると思います。

アドホックに絞る場合は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型に直して上のコードを使う必要があります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0