dowcal.py

名前を付けづらいというか。

結構必要になる割に汎用道具にしづらくて、だからネタになりにくい、てヤツなの。「月曜日だけカレンダー」は、欲しい? 欲しくない?

「汎用のプログラミング言語」を使って、そしてこれを実現したい場合、これは実に「言語初心者向けトピック」にこそふさわしいものの、いわゆるカレンダーそのものと違い「誰でもいつでも頻繁に欲しい」ものではないため、「「汎用のプログラミング言語」を使っていつでも出来る」に留まってしまうわけね、これ。そうした「特殊ニーズ」のための「専用道具」を、なかなか作ろうという気にはならない、と。

ただこういうのってさ、「必要になるときに集中的に必要になる」と相場が決まってる。ワタシの今がまさにそうで。何がしたいかというと、ある番組のタイムスケジュールが例えば「隔週木曜日」とわかっているとして、「#143」が 2021-12-14 だったとして、じゃぁ「#132」は何月何日だ、というのを知りたい、みたいなときにね、カレンダーを目視で追っかけるのが結構キツいの。この場合「木曜オンリーの一覧でいい」てわけな。てなやつ:

dowcal.py
 1 # -*- coding: utf-8 -*-
 2 import json
 3 from datetime import datetime, timedelta
 4 
 5 
 6 if __name__ == '__main__':
 7     import argparse
 8     ap = argparse.ArgumentParser()
 9     ap.add_argument(
10         "--startdate",
11         default=datetime.now().replace(month=1, day=1).strftime("%Y-%m-%d"))
12     ap.add_argument(
13         "--dows",
14         default="[0]",
15         help="please specify a list of dows such as '[0, 1]'")
16     ap.add_argument("--num_of_weeks", type=int, default=52)
17     ap.add_argument(
18         "--format",
19         default="%Y-%m-%d %a",
20         help="such as '%%Y-%%m-%%d %%A'")
21     ap.add_argument("--separator_month", default="")
22     args = ap.parse_args()
23     era = datetime.strptime(args.startdate, "%Y-%m-%d")
24     dows = json.loads(args.dows)
25     while all([era.weekday() != dow for dow in dows]):
26         era += timedelta(days=1)
27     last = dt = era
28     for i in range(args.num_of_weeks):
29         for j in range(7):
30             tmp = dt + timedelta(days=j)
31             if tmp.weekday() in dows:
32                 if args.separator_month and last.month != tmp.month:
33                     print(args.separator_month)
34                 print(tmp.strftime(args.format))
35                 last = tmp
36         dt += timedelta(days=7)
 1 [me@host: ~]$ python3 dowcal.py --se="-" --d='[5, 6]' --n=20
 2 2022-01-01 Sat
 3 2022-01-02 Sun
 4 2022-01-08 Sat
 5 2022-01-09 Sun
 6 2022-01-15 Sat
 7 2022-01-16 Sun
 8 2022-01-22 Sat
 9 2022-01-23 Sun
10 2022-01-29 Sat
11 2022-01-30 Sun
12 -
13 2022-02-05 Sat
14 2022-02-06 Sun
15 2022-02-12 Sat
16 2022-02-13 Sun
17 2022-02-19 Sat
18 2022-02-20 Sun
19 2022-02-26 Sat
20 2022-02-27 Sun
21 -
22 2022-03-05 Sat
23 2022-03-06 Sun
24 2022-03-12 Sat
25 2022-03-13 Sun
26 2022-03-19 Sat
27 2022-03-20 Sun
28 2022-03-26 Sat
29 2022-03-27 Sun
30 -
31 2022-04-02 Sat
32 2022-04-03 Sun
33 2022-04-09 Sat
34 2022-04-10 Sun
35 2022-04-16 Sat
36 2022-04-17 Sun
37 2022-04-23 Sat
38 2022-04-24 Sun
39 2022-04-30 Sat
40 -
41 2022-05-01 Sun
42 2022-05-07 Sat
43 2022-05-08 Sun
44 2022-05-14 Sat
45 2022-05-15 Sun

「非常に簡単にプログラミング出来る」ということ自体は真実だけれど、実際これが何度も必要になるとすりゃぁこれだって鬱陶しい作業だし、なんせね、strftime のフォーマットって、Python のドキュメントの関係で調べにくいんだわ(docstring 内で説明してくれてないの)。