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 モジュールには、こういった際の計算に使用できるユーティリティ関数やクラスが含まれています。
それらを利用して次のような関数を用意することが一般的な対処方法でしょう。
実行はこのようになります。
次のように start_date 引数に何も指定しなければ今日の日付がデフォルトで使用されますし、
特定の日付を指定することもできます。
この get_previous_byday 関数では、start_date の曜日を月曜日を 0 とする数値で取得し、指定された曜日が何日前にあたるかを計算で求めています。最終的にその日数を timedelta オブジェクトに設定し、start_date から引いて target_date を取得しています。
もしこれと同様の日時関連計算を高頻度で行うのであれば、Python Cookbook [Converting Days to Seconds, and Other Basic Time Conversions : 日付の秒数への変換、及び、他の基本的な日時変換] の記事でも紹介した dateutil ライブラリの利用が便利です。
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
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)
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 ← 前の金曜日
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 ← 前の金曜日
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -