首页 > 解决方案 > 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])

标签: pythoncalendarschedule

解决方案


这会生成每周计划列表。每个每周时间表都是从星期一开始到星期日的列表。星期一到星期日的选择只是为了与 Python 在datetimecalendar模块中的星期顺序保持一致。

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))。

这不考虑实际日期,但如果有用,我很乐意补充。


推荐阅读