検索ガイド -Search Guide-

単語と単語を空白で区切ることで AND 検索になります。
例: python デコレータ ('python' と 'デコレータ' 両方を含む記事を検索します)
単語の前に '-' を付けることで NOT 検索になります。
例: python -デコレータ ('python' は含むが 'デコレータ' は含まない記事を検索します)
" (ダブルクオート) で語句を囲むことで 完全一致検索になります。
例: "python data" 実装 ('python data' と '実装' 両方を含む記事を検索します。'python data 実装' の検索とは異なります。)
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
>>
python_cookbook

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

Published 2020年4月16日19:16 by mootaro23

SUPPORT UKRAINE

- Your indifference to the act of cruelty can thrive rogue nations like Russia -

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 ← 前の金曜日