python - Python 计算轮班工作的休息日
问题描述
我是 python 新手,我想不出任何可以解决这个问题的策略或现有模块。我想根据以下时间表(2018 年 7 月这一周的实际时间表)制作一个简单的程序,如果未来的某一天是否是休息日,它将返回:
Week 1: 1:Sun:off 2:Mon 3:Tues 4:Wed:off 5:Thur 6:Fri 7:Sat Week 2: 8:Sun: 9:Mon:off 10:Tues 11:Wed 12:Thur 13:Fri 14:Sat:off Week 3:15:Sun:off 16:Mon 17:Tues 18:Wed:off 19:Thur 20:Fri 21:Sat Week 4:22:Sun 23:Mon:off 24:Tues 25:Wed 26:Thur 27:Fri 28:Sat:off
import datetime
sched1 = {'Mon':'working','Tues':'working','Wed':'off','Thur':'working','Fri':'working','Sat':'working','Sun':'off'}
sched2 = {'Mon':'off','Tues':'working','Wed':'working','Thur':'working','Fri':'working','Sat':'off','Sun':'working'}
pickdate1 = int(input("Enter a date in the year (YYYY)): "))
pickdate2 = int(input("Enter a date in the year (MM): "))
pickdate3 = int(input("Enter a date in the year (DD): "))
date = datetime.date(pickdate1,pickdate2,pickdate3)
weekno = datetime.date(pickdate1,pickdate2,pickdate3).isocalendar()[1]
weekday = datetime.date.isoweekday(date)
if weekno % 2 == 0:
print (sched2[weekday])
elif weekno % 2 != 0:
print (sched1[weekday])
解决方案
这会生成每周计划列表。每个每周时间表都是从星期一开始到星期日的列表。星期一到星期日的选择只是为了与 Python 在datetime和calendar模块中的星期顺序保持一致。
weeks = []
num_weeks = 4 # how many weeks to schedule
days_off = [
(2, 6), # sunday and wednesday
(0, 5), # monday and saturday
]
for week in range(num_weeks):
days_off_this_week = days_off[week % len(days_off)]
weeks.append([bool(i not in days_off_this_week) for i in range(7)])
这里的关键是使用%
运算符 ( week % len(days_off)
),而不是//
确定我们应该使用哪一周的时间表。因为我们使用len(days_off)
我们可以通过简单地添加一个条目来使我们的 2 周轮换成为 3 或 4 周轮换days_off
,并且日历仍然可以工作。
将星期几存储为整数,开/关存储为布尔值,为我们以后如何组织这些信息以进行显示提供了很大的灵活性。我们可以使用日历模块轻松打印日程:
import calendar
from collections import OrderedDict
cal = calendar.Calendar(calendar.SUNDAY)
for week in weeks:
print(OrderedDict([(calendar.day_abbr[i], ("On" if week[i] else "Off")) for i in cal.iterweekdays()]))
要在我们的显示中更改每周的第一个工作日,我们只需将一周中的不同日期传递给calendar.Calendar
,(例如calendar.Calendar(calendar.MONDAY)
)。
这不考虑实际日期,但如果有用,我很乐意补充。
推荐阅读
- sql - 带有条件语句和内部联接的 SQL
- java - 如何在并行化的 Junit 5 测试类中按顺序执行测试方法的参数化运行?
- sql - MSSQL:分组和计数
- android - Android Beacon Library - 如何停止保存文件保存?“android-beacon-library-scan-state”变得太大了
- activemq - ActiveMQ:如何限制发送的消息数量?
- python - 使用 np.abs 将 dataframe 中的 real 和 imag 列组合成复数以获得幅度
- javascript - 表格标题未与 ajax 调用的表格行对齐
- python-3.x - 密码生成器中的 Python 大小问题
- rust - Gdb:目标远程连接在错误的位置?
- c# - 为什么 XmlNamespaceManager 为 HasNamespace 返回不一致的结果?