ISO Week Numberのような週番号を管理するためのライブラリです。 週番号を定義する際には、
- 週の始まりを何曜日にするか
- 各年の第一週を、どこにするか
という点に自由度があり、目的によって様々な定義があり得ます。
このパッケージは、上記のような定義を自由にカスタマイズしながら、 週単位での加減算や差分を計算する機能を提供します。
特に依存するライブラリはありません。pip install mdweek
を実行して下さい。
WeekConfig
を継承したクラスを定義することで、週の定義がカスタマイズ可能になります。
class SundayMar1Config(WeekConfig):
"""
- 週の始まりが日曜日
- 3/1を含む週が第一週
という定義の週番号を行うためのカスタマイズ用クラス。
"""
def first_date(self, year):
return date(year, 3, 1)
@property
def first_dow(self, ):
return 7
上記のクラスのインスタンスを引数に、setup_week_config
を呼び出して下さい。
setup_week_config(SundayMar1Config())
これ以降、週番号の計算は、
- 週の始まりが日曜日
- 3/1を含む週が第一週
というポリシーで行われます。
Week.from_date
関数を使います。これはstaticmethodです。
for i in range(-10, 10):
d = date(2021, 3, 1) + timedelta(days=i)
print(f"{d} -> {Week.from_date(d)}")
2021-02-19 -> 2020/51
2021-02-20 -> 2020/51
2021-02-21 -> 2020/52
2021-02-22 -> 2020/52
2021-02-23 -> 2020/52
2021-02-24 -> 2020/52
2021-02-25 -> 2020/52
2021-02-26 -> 2020/52
2021-02-27 -> 2020/52
2021-02-28 -> 2021/1
2021-03-01 -> 2021/1
2021-03-02 -> 2021/1
2021-03-03 -> 2021/1
2021-03-04 -> 2021/1
2021-03-05 -> 2021/1
2021-03-06 -> 2021/1
2021-03-07 -> 2021/2
2021-03-08 -> 2021/2
2021-03-09 -> 2021/2
2021-03-10 -> 2021/2
Week.date
関数を使います。
week = Week(2021, 1)
for i in range(1, 8):
print(f"{week} {i} -> {week.date(i)}")
2021/1 1 -> 2021-03-01 # 月
2021/1 2 -> 2021-03-02 # 火
2021/1 3 -> 2021-03-03 # 水
2021/1 4 -> 2021-03-04 # 木
2021/1 5 -> 2021-03-05 # 金
2021/1 6 -> 2021-03-06 # 土
2021/1 7 -> 2021-02-28 # 日 注意:日曜日始まりの定義なので2/28で正しい
week2 = Week(2021, 2)
print("引き算")
for i in range(5, 0, -1):
print(f"{week2} - {i} = {week2 - i}")
week3 = Week(2021, 50)
print("足し算")
for i in range(1, 5):
print(f"{week3} + {i} = {week3 + i}")
引き算
2021/2 - 5 = 2020/49
2021/2 - 4 = 2020/50
2021/2 - 3 = 2020/51
2021/2 - 2 = 2020/52
2021/2 - 1 = 2021/1
足し算
2021/50 + 1 = 2021/51
2021/50 + 2 = 2021/52
2021/50 + 3 = 2022/1
2021/50 + 4 = 2022/2
print(f"1998年30週〜2030年4週は -> {Week(2030, 4) - Week(1998, 30)}週間")
1998年30週〜2030年4週は -> 1643週間