Data Analysis/Python

3 Shift Work Schedule Automatic Program_Python

뉴욕킴 2023. 11. 8. 23:25

1) 참고자료

How to Solve a Staff Scheduling Problem with Python | by Khuyen Tran | Towards Data Science

 

How to Solve a Staff Scheduling Problem with Python

Minimize the number of workers per shift while assigning enough workers for each time window

towardsdatascience.com


pip install openpyxl
import pandas as pd
from openpyxl import Workbook
# 사원 정보 입력 함수
def input_employee_info(num_employees, employee_info):
    for i in range(num_employees):
        employee_id = input(f"사번 입력 ({i+1}/{num_employees}): ")
        name = input(f"이름 입력 ({i+1}/{num_employees}): ")
        phone_number = input(f"전화번호 입력 ({i+1}/{num_employees}): ")
        employee_info.append([employee_id, name, phone_number])
# 4명의 사원 정보 입력
num_employees = 4
employee_info = []
input_employee_info(num_employees, employee_info)
# 스케줄 생성
def generate_schedule(num_people):
    schedule = []
    for i in range(num_people):
        if i % 3 == 0:
            schedule.append("1교대")
        elif i % 3 == 1:
            schedule.append("2교대")
        else:
            schedule.append("3교대")
    return schedule
# 스케줄 추출 및 엑셀 파일로 저장
from google.colab import drive

def export_to_excel(schedule):
    df = pd.DataFrame({"스케줄": schedule})
    drive.mount('/content/drive')  # 구글 드라이브 마운트
    file_path = "/content/drive/MyDrive/데이터분석 데이터/schedule.xlsx"  # 구글 드라이브 경로
    wb = Workbook()
    ws = wb.active
    for i, row in enumerate(df.values, start=1):
        ws.cell(row=i, column=1, value=row[0])
    wb.save(file_path)  # 구글 드라이브 경로에 파일 저장
# 휴가 신청 함수
def request_vacation(employee_id, start_date, end_date):
    # 휴가 신청 날짜를 스케줄표에서 삭제
    for date in pd.date_range(start=start_date, end=end_date):
        date_str = date.strftime("%Y-%m-%d")
        if date_str in schedule_data:
            del schedule_data[date_str]
def request_vacation(employee_id, start_date, end_date):
    # 휴가 신청 날짜를 스케줄표에서 삭제
    for date in pd.date_range(start=start_date, end=end_date):
        date_str = date.strftime("%Y-%m-%d")
        if date_str in schedule_data:
            del schedule_data[date_str]

# 사용자로부터 값을 입력받음
employee_id = input("사원 ID를 입력하세요: ")
start_date = input("시작 날짜를 입력하세요 (YYYY-MM-DD): ")
end_date = input("종료 날짜를 입력하세요 (YYYY-MM-DD): ")

# 함수 호출
request_vacation(employee_id, start_date, end_date)
# 휴가 신청 정보를 엑셀 파일에 저장 (기존 엑셀 파일에 추가할 경우)
    with pd.ExcelWriter("vacation_requests.xlsx", mode="a", engine="openpyxl") as writer:
        vacation_data.to_excel(writer, sheet_name="VacationRequests", index=False)
    
    print("휴가 신청이 정상적으로 처리되었습니다.")
# 수정된 스케줄표 출력
print("수정된 스케줄표:")
for date, shift in schedule_data.items():
    print(f"{date}: {shift}")
# 퇴사한 직원의 인덱스를 찾아 슬라이싱을 사용하여 리스트에서 제외
index_to_remove = employees.index("직원3")
employees = employees[:index_to_remove] + employees[index_to_remove+1:]

print(employees)