Python Расчет выходных дней с вращающейся рабочей смены - PullRequest
0 голосов
/ 04 июля 2018

Я новичок в Python, и я не могу понять какую-либо стратегию или существующие модуль, который решит эту проблему. Я хотел бы сделать простой Программа, которая вернется, если данный день в будущем будет день выключено или нет на основе следующего графика (фактическое расписание для этого неделя июля 2018):

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

Ответы [ 2 ]

0 голосов
/ 05 июля 2018
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:
    if weekday == 1:
        print ("You are: %s" % (sched2['Mon']))
    elif weekday == 2:
        print ("You are: %s" % (sched2['Tues']))
    elif weekday == 3:
        print ("You are: %s" % (sched2['Wed']))
    elif weekday == 4:
        print ("You are: %s" %  (sched2['Thur']))
    elif weekday == 5:
        print ("You are: %s" %  (sched2['Fri']))
    elif weekday == 6:
        print ("You are: %s" %  (sched2['Sat']))
    elif weekday == 7:
        print ("You are: %s" %  (sched2['Sun']))
elif weekno % 2 != 0:
    if weekday == 1:
        print ("You are: %s" %  (sched1['Mon']))
    elif weekday == 2:
        print ("You are: %s" %  (sched1['Tues']))
    elif weekday == 3:
        print ("You are: %s" %  (sched1['Wed']))
    elif weekday == 4:
        print ("You are: %s" %  (sched1['Thur']))
    elif weekday == 5:
        print ("You are: %s" %  (sched1['Fri']))
    elif weekday == 6:
        print ("You are: %s" %  (sched1['Sat']))
    elif weekday == 7:
        print ("You are: %s" %  (sched1['Sun']))
0 голосов
/ 04 июля 2018

Создает список еженедельных расписаний. Каждое недельное расписание - это список, начиная с понедельника и заканчивая воскресеньем Выбор с понедельника по воскресенье заключается в выравнивании с порядком дня недели в 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)).

Это не учитывает фактическую дату, но я с удовольствием добавлю это, если это будет полезно.

...