2019年4月27日土曜日

Pythonで第三金曜日とか求めてみた

Pythonで第三火曜日とかを求めてみた。 単純に、ゴミ出し日を、 khal で登録してみたかったから。

いくつか見付けることができたが、 calendarを使う方法と、 dateutilを使う方法を試してみた。 出発点は、 ここ だったかな。

calendar を使う

ゴミ出しは、月毎なので、こちらの方が感覚に合うように思う。

#!~/.pyenv/shims/python
"""Calendat module test."""

import sys
import logging

from calendar import Calendar, TextCalendar

import logzero

LOG_FORMAT = "%(color)s[%(module)s.%(funcName)s:%(lineno)3d]%(end_color)s %(message)s"
FORMATTER = logzero.LogFormatter(fmt=LOG_FORMAT)
logzero.setup_default_logger(formatter=FORMATTER)
logzero.logfile("./log000.log", maxBytes=3e5, backupCount=3)
logzero.loglevel(logging.DEBUG)

def match_weekday(c_year, c_month, c_wday, c_oweek):
    """Calc date of n-th weekday."""
    # c_year, c_month = 2019, 5
    # c_wday = 5   # Monday is Zero
    # c_oweek = 2  # 1st weeek is Zero

    # 指定されて曜日だけのリスト作成
    weday_list = Calendar(firstweekday=0).monthdayscalendar(c_year, c_month)
    sel_wekday = [x[c_wday] for x in weday_list if x[c_wday] != 0]

    # 指定された週の日付を返す
    try:
        match_date = sel_wekday[c_oweek]
    except IndexError:
        match_date = -1

    return match_date


def main():
    """Do main."""
    #

    wday_char = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
    week_char = ["1st", "2nd", "3rd", "4th", "5th"]

    r_year, r_month = 2019, 5
    r_weday = 4  # Zero is Monday
    r_oweek = 2  # 1st weekday is Zero

    # 指定された年、月のカレンダーの表示
    tcalendar = TextCalendar(firstweekday=r_weday)
    print(tcalendar.formatmonth(r_year, r_month))

    match_day = match_weekday(r_year, r_month, r_weday, r_oweek)

    logzero.logger.info(
        "\n* {0:s} {1:s}({2:02d}/{3:02d}) 不燃ゴミ".format(
            week_char[r_oweek], wday_char[r_weday], r_month, match_day
        )
    )

    logzero.logger.info(
        "\n* khal new -a garbage {0:4d}{1:02d}{2:02d} 不燃ゴミ".format(
            r_year, r_month, match_day
        )
    )

    sys.exit()


if __name__ == "__main__":
    main()
    sys.exit()
#

   $ python t15_calendar.py
         May 2019
   Fr Sa Su Mo Tu We Th
                   1  2
    3  4  5  6  7  8  9
   10 11 12 13 14 15 16
   17 18 19 20 21 22 23
   24 25 26 27 28 29 30
   31

   [t15_calendar.main: 88]
       * 3rd Fri(05/17) 不燃ゴミ
   [t15_calendar.main: 94]
       * khal new -a garbage 20190517 不燃ゴミ

dateutil を使う

ゴミ収集日なので、4週めまででよい。
もっと複雑なことをやるためのツールという印象。

datetimeなので、該当日が休日かどうかも判定させてみた。 休日の判定は、 jpholiday を使ってみた。

#!~/.pyenv/shims/python
"""dateutil and jpholiday module test."""

import sys
import logging
import datetime
from calendar import TextCalendar

import logzero
import jpholiday
from dateutil.rrule import MONTHLY, rrule

LOG_FORMAT = "%(color)s[%(module)s.%(funcName)s:%(lineno)3d]%(end_color)s %(message)s"
FORMATTER = logzero.LogFormatter(fmt=LOG_FORMAT)
logzero.setup_default_logger(formatter=FORMATTER)
logzero.logfile("./log000.log", maxBytes=3e5, backupCount=3)
logzero.loglevel(logging.DEBUG)


def match_weekday2(c_year, c_month, c_wday, c_oweek):
    """Calc date of n-th weekday."""
    # c_year, c_month = 2019, 5
    # c_wday = 5   # Monday is Zero
    # c_oweek = 2  # 1st weeek is 1

    # 指定されて年、月の開始日
    dt_stday = datetime.date(c_year, c_month, 1)

    # 指定されて年、月の1日から4つめまでの指定曜日リストから選択
    try:
        match_date = rrule(
            freq=MONTHLY, dtstart=dt_stday, byweekday=c_wday, count=4
        )[c_oweek]
    except IndexError:
        # 該当がなければ、負
        match_date = -1

    return match_date


def main():
    """Doing a read viking file for make class."""
    #

    r_year, r_month = 2019, 5
    r_weday = 4  # Zero is Monday
    r_oweek = 0  # 1st weekday is Zero

    tcalendar = TextCalendar(firstweekday=0)
    print(tcalendar.formatmonth(r_year, r_month))

    match_day = match_weekday2(r_year, r_month, r_weday, r_oweek)
    if rr_day != -1:
        mes_str = match_day.strftime("\n* %m-%d %a 不燃ゴミ")
        if jpholiday.is_holiday_name(match_day.date()):
            # 休日だったら、追加
            mes_str += ": {0:s}".format(
                jpholiday.is_holiday_name(match_day.date()))
        logzero.logger.info(mes_str)


if __name__ == "__main__":
    main()
    sys.exit()
#


   $ python t15_dateutil.py
         May 2019
   Mo Tu We Th Fr Sa Su
          1  2  3  4  5
    6  7  8  9 10 11 12
   13 14 15 16 17 18 19
   20 21 22 23 24 25 26
   27 28 29 30 31

   [t15_dateutil.main:114]
       * 05-03 Fri 不燃ゴミ: 憲法記念日

これを、今月と来月について、 まとめて表示させたのが以下。


$ python garbage_date.py 
  
     2019-05 (current month)
    
     !!  check
     khal list -a pubs 20190501 30d
    
     khal new -a pubs 20190507 空缶、危険、有害ゴミ :: garbage
     khal new -a pubs 20190514 古紙、布, ペットボトル :: garbage
     khal new -a pubs 20190521 空瓶、ガラス :: garbage
     khal new -a pubs 20190528 燃えないゴミ :: garbage
    
     2019-06 (Next month)
    
     khal list -a pubs 20190601 29d
    
     khal new -a pubs 20190604 空缶、危険、有害ゴミ :: garbage
     khal new -a pubs 20190611 古紙、布, ペットボトル :: garbage
     khal new -a pubs 20190618 空瓶、ガラス :: garbage
     khal new -a pubs 20190625 燃えないゴミ :: garbage

ターミナル上のコピペで作業できるようになった。よしとしよう。

0 件のコメント:

コメントを投稿

麻のボディタオル

2018年の秋(まだ、自転車を封印してない)、 近江上布伝統産業会館 で、興味からボディタオルを購入した。 お、よかった。: 自然派パン工房 ふるさとの道 ほぼ毎日風呂で使ってきて、ついに寿命がきたようだ。 お店の方に、「糸が痩せて破れてくる」まで使える、と...