cover_python_cookbook

Python Cookbook [Determining Last Friday's Date : 前の金曜日は何日?] 投稿一覧へ戻る

Tags: Python , Cookbook , relativedelta , datetime , timedelta , dateutil , weekday

Published 2020年4月16日19:16 by T.Tsuyoshi

Problem : 直前のある曜日 (例えば前の金曜日とか) が何日だったかを知りたい。


Solution : Python の datetime モジュールには、こういった際の計算に使用できるユーティリティ関数やクラスが含まれています。


それらを利用して次のような関数を用意することが一般的な対処方法でしょう。

from datetime import datetime, timedelta

weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

def get_previous_byday(dayname, start_date = None):
    if start_date is None:
        start_date = datetime.today()

    day_num = start_date.weekday()
    day_num_target = weekdays.index(dayname)
    days_ago = (7 + day_num - day_num_target) % 7
    if days_ago == 0:
        days_ago = 7

    target_date = start_date - timedelta(days = days_ago)
    return target_date



実行はこのようになります。

cur_date = datetime.today()
cur_date # → datetime.datetime(2020, 4, 16, 18, 36, 54, 880257) ← 今日は木曜日です

get_previous_byday('Monday', cur_date) # → datetime.datetime(2020, 4, 13, 18, 36, 54, 880257)

get_previous_byday('Thursday', cur_date) # → datetime.datetime(2020, 4, 9, 18, 36, 54, 880257) ← 今日ではなく先週の木曜日は 4月9日

get_previous_byday('Sunday', cur_date) # → datetime.datetime(2020, 4, 12, 18, 36, 54, 880257)



次のように start_date 引数に何も指定しなければ今日の日付がデフォルトで使用されますし、

get_previous_byday('Tuesday') # → datetime.datetime(2020, 4, 14, 18, 46, 13, 330292)



特定の日付を指定することもできます。

get_previous_byday('Wednesday', datetime(1994, 5, 25)) # → datetime.datetime(1994, 5, 18, 0, 0)



この get_previous_byday 関数では、start_date の曜日を月曜日を 0 とする数値で取得し、指定された曜日が何日前にあたるかを計算で求めています。最終的にその日数を timedelta オブジェクトに設定し、start_date から引いて target_date を取得しています。


もしこれと同様の日時関連計算を高頻度で行うのであれば、Python Cookbook [Converting Days to Seconds, and Other Basic Time Conversions : 日付の秒数への変換、及び、他の基本的な日時変換] の記事でも紹介した dateutil ライブラリの利用が便利です。

from datetime import datetime
from dateutil.relativedelta import relativedelta
from dateutil.rrule import *

d = datetime.now()
print(d) # → 2020-04-16 19:06:09.510559

print(d + relativedelta(weekday=FR)) # → 2020-04-17 19:06:09.510559 ← 次の金曜日

print(d + relativedelta(weekday=FR(-1))) # → 2020-04-10 19:06:09.510559 ← 前の金曜日

この投稿をメールでシェアする

0 comments

コメントはまだありません。

コメントを追加する(不適切と思われるコメントは削除する場合があります)