以前、「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
# 休日(祝日と日曜日と振替休日)を判定する関数。
# 休日ならばその名称、休日でなければ空文字を返す。
# 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)
dateobj = datetime.date(2020, 9, 21)
h = getHoliday(dateobj)
print(dateobj, h)
コメント