🏊‍♂️

[Python]昨日や明日、月末などの日付を取得したい

2021/05/02に公開

日付を使う時

Pythonって何かとバッチ処理とか作ることとか多いと思うんですよ。

バッチ処理作る時、「昨日分のデータ取ってくる」とか「月初に先月のデータを取ってくる」とかだと思うんです。そしたら、実行時の「昨日」とか、「先月」ってどうやってとるんだろう?とお仕事でちょいと悩んだのでまとめます。

datetimeについて

基本的なdatetimeについて少しおさらいです。

import datetime

# 今日の日付を取得する。この場合「2020-04-01」
# datetime.datetime.today()なら時間まで保持する
today = datetime.date.today()

# 年を取得。この場合「2020」
today.year

# 月を取得。この場合「4」
today.month

# 日を取得。この場合「2」
today.day

# 曜日を取得。この場合は「3」(水曜日)
# 0:月,1:火,2:水,3:木,4:金,5:土,6:日
today.weekday()

使い方色々

今日、昨日、明日、1週間前、1週間後、1ヶ月前、1ヶ月後、1年前、1年後

import datetime
from dateutil.relativedelta import relativedelta

# 今日# => 2020-04-02
today = datetime.date.today()

# 昨日# => 2020-04-01
yesterday = today + relativedelta(days=-1)

# 明日# => 2020-04-03
tommorow = today + relativedelta(days=+1)

# 1週間前# => 2020-03-26
one_week_ago = today + relativedelta(weeks=-1)

# 1週間後# => 2020-04-09
one_week_later = today + relativedelta(weeks=+1)

# 1ヶ月前# => 2020-03-02
one_month_ago = today + relativedelta(months=-1)

# 1ヶ月後# => 2020-05-02
one_month_later = today + relativedelta(months=+1)

# 1年前# => 2019-04-02
one_year_ago = today + relativedelta(years=-1)

# 1年後# => 2021-04-02
one_year_later = today + relativedelta(years=+1)

月初、月末、先月初、先月末、翌月初、翌月末

import datetime
from dateutil.relativedelta import relativedelta

# 今日# => 2020-04-02
today = datetime.date.today()

# 月初(今月の1日にする) # => 2020-04-01
beginning_of_the_month = today + relativedelta(day=1)

# 月末 (来月の1日に合わせて1日分戻る) # => 2020-04-30
end_of_month = today + relativedelta(months=+1,day=1,days=-1)

# 先月初(1月分戻して、1日にする)# => 2020-03-01
beginning_of_the_last_month = today + relativedelta(months=-1,day=1)

# 先月末 (今月の1日から1日分戻る)# => 2020-03-31
end_of_the_last_month = today + relativedelta(day=1,days=-1)

# 翌月初(1月分進めて、1日にする)# => 2020-05-01
beginning_of_the_next_month = today + relativedelta(months=+1,day=1)

# 翌月末 (翌々月初[2ヶ月後の1日]から1日分戻す)# => 2020-05-31
end_of_the_next_month = today + relativedelta(months=+2,day=1,days=-1)

考え方

year,month,dayなどで絶対的にして、years,months,daysなどで相対的に指定しています。

参考

https://dateutil.readthedocs.io/en/stable/relativedelta.html

Discussion