Python で月初・月末・週初めの日付を取得する
レポート作成や集計処理では、月初・月末・週初めといった区切りの日付が必要になります。Python でこれらを取得する方法をまとめました。
月初を取得する
replace() メソッドで日を 1 に置き換えるだけです。
from datetime import date
today = date(2025, 1, 15)
first_day = today.replace(day=1)
print(first_day) # 2025-01-01
datetime オブジェクトでも同様に使えます。時刻部分はそのまま維持されます。
from datetime import datetime
now = datetime(2025, 1, 15, 14, 30, 0)
first_day = now.replace(day=1)
print(first_day) # 2025-01-01 14:30:00
月末を取得する
月末は月によって日数が異なるため、calendar.monthrange() を使います。
from datetime import date
import calendar
today = date(2025, 1, 15)
last_day_num = calendar.monthrange(today.year, today.month)[1]
last_day = today.replace(day=last_day_num)
print(last_day) # 2025-01-31
monthrange() は (月の最初の曜日, 月の日数) のタプルを返します。2番目の要素が月末の日付です。2月のうるう年も自動で考慮されます。
import calendar
# 2024年はうるう年
print(calendar.monthrange(2024, 2)) # (3, 29)
# 2025年は平年
print(calendar.monthrange(2025, 2)) # (5, 28)
週初め(月曜日)を取得する
weekday() メソッドを使って、当日からの差分を計算します。
from datetime import date, timedelta
today = date(2025, 1, 15) # 水曜日
monday = today - timedelta(days=today.weekday())
print(monday) # 2025-01-13
weekday() は月曜が 0、火曜が 1、…、日曜が 6 を返すため、その値を引けば月曜日になります。
週末(日曜日)を取得する
月曜日から6日足せば日曜日です。
from datetime import date, timedelta
today = date(2025, 1, 15)
monday = today - timedelta(days=today.weekday())
sunday = monday + timedelta(days=6)
print(sunday) # 2025-01-19
翌月・前月の初日を取得する
月をまたぐ計算は少し工夫が必要です。
from datetime import date
def next_month_first(d):
"""翌月の1日を取得"""
if d.month == 12:
return d.replace(year=d.year + 1, month=1, day=1)
return d.replace(month=d.month + 1, day=1)
def prev_month_first(d):
"""前月の1日を取得"""
if d.month == 1:
return d.replace(year=d.year - 1, month=12, day=1)
return d.replace(month=d.month - 1, day=1)
today = date(2025, 1, 15)
print(next_month_first(today)) # 2025-02-01
print(prev_month_first(today)) # 2024-12-01
12月と1月の境界で年をまたぐ処理を忘れずに入れておきましょう。
dateutil を使うとシンプルに
dateutil ライブラリの relativedelta を使えば、月の加減算が簡単になります。
from datetime import date
from dateutil.relativedelta import relativedelta
today = date(2025, 1, 15)
# 翌月の1日
next_month = (today.replace(day=1) + relativedelta(months=1))
print(next_month) # 2025-02-01
# 前月の1日
prev_month = (today.replace(day=1) - relativedelta(months=1))
print(prev_month) # 2024-12-01
標準ライブラリの timedelta では months を指定できませんが、relativedelta なら直感的に月の加減算ができます。複雑な日付計算が多いプロジェクトでは、dateutil の導入を検討してみてください。