こんにちは、hokkyokunです。
pythonで日付から曜日を取得する必要が出てきたので、その一環として
第何週第何曜日かを日付から取得できる関数を作ってみました。
必要な知識
- divmod:商と余りをタプルで返す
- datetimeから日付や時間を取得
- weekdayメソッドで曜日を数値で取得
スポンサーリンク
divmod:商と余りをタプルで返す
商と余りの確認
商と余りの関係性をおさらいしておきましょう。
(割られる数)÷(割る数)=(商)…(余り)
# 10÷3の商と余りをタプルで取得
divmod_=divmod(10,3) # 商と余りをタプルで取得
print(divmod_)
## (3,1)
# タプルから要素を取得
q=divmod_[0] # 商
r=divmod_ # 余り
print(q)
## 3
print(r)
## 1
datetimeから日付を取得
datetime.dateでdate型(年、月、日まで)
datetime.datetimeでdatetime型(年、月、日、時間、分、秒)
を取得
import datetime
# date型で取得
today_=datetime.date.today()
print(type(today_))
print(today_)
## <class 'datetime.date'>
## 2022-04-11
# datetime型で取得
now_=datetime.datetime.now()
print(type(now_))
print(now_)
## <class 'datetime.datetime'>
## 2022-04-11 16:28:46.452562
Weekdayメソッド:曜日を数値で取得
import datetime
today_=datetime.date.today()
now_=datetime.datetime.now()
# weekday()で曜日を数値で取得(月曜日:0、日曜日:6)
today_.weekday()
print(today_.weekday())
## 0
# datetime型でも取得できる
now_.weekday()
print(now_.weekday())
## 0
# リストを用意すれば曜日に変更もできる
# 最初を月曜日にするのを注意する
lists=["月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"]
print(today_.weekday())
## 0
print(lists[today_.weekday()])
## 月曜日
これらの知識をまとめて関数を作成
## week_num : 対象の日付が第X週
## DayOfWeek : 曜日
def get_WeekNum_and_DayOfWeek(date_):
# リストを用意(weekday()で取得した数値を曜日に変換)
lists=["月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"]
divmod_=divmod(date_.day,7) # 日付を7で割って商と余りを取得
# 商が0=日付が6日以下の場合は第一週
if divmod_[0]==0:
week_num=1
# 余りが0=7の倍数の日数は商=第X週
elif divmod_==0:
week_num=divmod_[0]
# それ以外=商が1以上かつあまりもある⇒商+1=第X週
else:
week_num=divmod_[0]+1
# 戻り値は第X週と曜日の二つ
return (week_num,lists[date_.weekday()])
date_=datetime.date.today()
# こんな感じで変数を戻り値分用意すればそれぞれの変数に直性代入できる
week_num,DayOfWeek=get_WeekNum_and_DayOfWeek(date_)
print(f"{date_}は第{week_num}週{DayOfWeek}")
## 2022-04-11は第2週月曜日
ここからの応用
今回は日付から第何週の何曜日かを取得しました。
これをそのまま使ったり、あるいは考え方を展開して応用すると以下の使い方ができるかなと思います。
- 第何営業日かを取得し、月次報告や月報、経理処理などのトリガー発動
- プロジェクトの進捗状況の計算(発足後第何週みたいな感じ)
- 株価の移動平均線の計算(52週までの値など)
起点と終点の日付とその間の日数を取得すれば上の処理はできると思います。
またチャレンジしてみたいので、できたら記事にします。
ではでは。
スポンサーリンク