Pythonで休日を判定する関数

Pocket

以前、「JavaScriptで休日を判定する関数」を紹介しましたが、今回はそのPython版です。

次の4個の関数を使います。
getHoliday 休日を返す。
getNationalHoliday 祝日を返す。
shunbun 春分を返す。
shubun 秋分を返す。

def getHoliday(dateobj):
  # 休日(祝日と日曜日と振替休日)を判定する関数。
  # 休日ならばその名称、休日でなければ空文字を返す。
  # 20200916 Python版を作成。
  if dateobj.year < 2007:
    return "2007年以上にしてください。"
  kyujitsu = "休日"
  holidayname = [""] * 6
  isNH = [False] * 6
  isSun = [False] * 6
  for i in range( - 3, 2):
    thisday = dateobj + datetime.timedelta(days = i)
    holidayname[i] = getNationalHoliday(thisday)
    isNH[i] = (holidayname[i] != "")
    isSun[i] = (thisday.weekday() == 6)

  # 国民の祝日に関する法律第三条
  # 第1項 「国民の祝日」は、休日とする。
  if isNH[0]:
    return holidayname[0]
  # 第2項 「国民の祝日」が日曜日に当たるときは、
  # その日後においてその日に最も近い「国民の祝日」でない日を
  # 休日とする。
  if isSun[ - 1] and isNH[ - 1]:
    return kyujitsu
  if isSun[ - 2] and isNH[ - 2] and isNH[ - 1]:
    return kyujitsu
  if isSun[ - 3] and isNH[ - 3] and isNH[ - 2] and isNH[ - 1]:
    return kyujitsu
  # 第3項 その前日及び翌日が「国民の祝日」である日は、休日とする。
  if isNH[ - 1] and isNH[1]:
    return kyujitsu
  # 日曜日
  if isSun[0]:
    return "日曜日"
  return ""

def getNationalHoliday(dateobj):
  #祝日を判定する関数。
  #祝日ならばその名称、祝日でなければ空文字を返す。
  #20200916 Python版を作成。
  if dateobj.year < 2007:
    return "2007年以上にしてください。"
  nen = dateobj.year
  tsuki = dateobj.month
  hi = dateobj.day
  yobi = dateobj.weekday() # 0:月曜日
  #2019年限定
  if nen == 2019 and tsuki == 5 and hi == 1:
    return "天皇の即位の日"
  elif nen == 2019 and tsuki == 10 and hi == 22:
    return "即位礼正殿の儀の行われる日"
  #2020年限定
  elif nen == 2020 and tsuki == 7 and hi == 23:
    return "海の日"
  elif nen == 2020 and tsuki == 7 and hi == 24:
    return "スポーツの日"
  elif nen == 2020 and tsuki == 8 and hi == 10:
    return "山の日"
  #一般
  elif tsuki == 1 and hi == 1:
    return "元日"
  elif tsuki == 2 and hi == 11:
    return "建国記念の日"
  elif tsuki == 4 and hi == 29:
    return "昭和の日"
  elif tsuki == 5 and hi == 3:
    return "憲法記念日"
  elif tsuki == 5 and hi == 4:
    return "みどりの日"
  elif tsuki == 5 and hi == 5:
    return "こどもの日"
  elif nen >= 2016 and nen != 2020 and tsuki == 8 and hi == 11:
    return "山の日" #2016年から。2020年だけ別。
  elif tsuki == 11 and hi == 3:
    return "文化の日"
  elif tsuki == 11 and hi == 23:
    return "勤労感謝の日"
  elif nen <= 2018 and tsuki == 12 and hi == 23:
    return "天皇誕生日" # 2018年まで。2020年は天皇の即位の日。
  elif nen >= 2020 and tsuki == 2 and hi == 23:
    return "天皇誕生日" # 2020年から。
  elif tsuki == 1 and yobi == 0 and 7 < hi and hi < 15:
    return "成人の日" # 1月第2月曜日。
  elif nen != 2020 and tsuki == 7 and yobi == 0 and 14 < hi and hi < 22:
    return "海の日" # 7月第3月曜日。2020年だけ別。
  elif tsuki == 9 and yobi == 0 and 14 < hi and hi < 22:
    return "敬老の日" # 9月第3月曜日。
  elif nen <= 2019 and tsuki == 10 and yobi == 0 and 7 < hi and hi < 15:
    return "体育の日" # 10月第2月曜日。2019年まで。
  elif nen >= 2021 and tsuki == 10 and yobi == 0 and 7 < hi and hi < 15:
    return "スポーツの日" # 10月第2月曜日。2021年から。2020年だけ別。
  elif tsuki == 3 and hi == shunbun(nen):
    return "春分の日"
  elif tsuki == 9 and hi == shubun(nen):
    return "秋分の日"
  else:
    return ""

def shunbun(nen): # 春分の日
  if nen < 1900 or nen > 2099:
    return 0
  if nen % 4 == 0:
    if nen <= 1956:
      return 21
    elif nen < 2088:
      return 20
    else:
      return 19
  elif nen%4 == 1:
    if nen <= 1989:
      return 21
    else:
      return 20
  elif nen%4 == 2:
    if nen <= 2022:
      return 21
    else:
      return 20
  else:
    if nen <= 1923:
      return 22
    elif nen <= 2055:
      return 21
    else:
      return 20

def shubun(nen): # 秋分の日
  if nen < 1900 or nen > 2099:
    return 0
  if nen % 4 == 0:
    if nen <= 2008:
      return 23
    else:
      return 22
  elif nen % 4 == 1:
    if nen <= 1917:
      return 24
    elif nen <= 2041:
      return 23
    else:
      return 22
  elif nen % 4 == 2:
    if nen <= 1946:
      return 24
    elif nen <= 2074:
      return 23
    else:
      return 22
  else:
    if nen <= 1979:
      return 24
    else:
      return 23

使用例は次のとおりです。

import datetime
dateobj = datetime.date(2020, 9, 21)
h = getHoliday(dateobj)
print(dateobj, h)

[ 2020年9月17日 | カテゴリー: デジタル | タグ: , , , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報