You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何从列表为DataFrame分配不同值生成合规员工排班表

Python员工排班表实现方案

原有代码问题

原代码中np.random.choice(shift)没有指定采样个数,只会从班次列表里返回1个随机值,传给DataFrame后会把这个单值填充到所有单元格,自然没法生成符合规则的随机排班;另外days列表里sunday前面多打了个空格,后续调用容易出现匹配错误。

排班规则落地逻辑

两个核心规则可以拆成两步实现,从硬约束到软随机依次处理,避免随机生成后反复校验的性能浪费:

  • 先处理休息日约束:给每个员工在周一到周五范围内随机选1天设为休息日,直接保证「每人每周仅1天休息、休息日不在周六周日」的要求
  • 再处理当班班次约束:逐天给当天需要上班的员工随机分配早/晚班,控制单个班次人数不超过2,周六周日全员排早/晚班,不安排休息

可直接运行的代码

import random
import pandas as pd

# 基础配置
shift_work = ['am', 'pm']
names = ['ola', 'ade', 'bisi']
days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
weekday_range = days[:5] # 允许安排休息的周一到周五区间

# 初始化空排班表
schedule_df = pd.DataFrame(index=names, columns=days)

# 第一步:为所有员工分配休息日
for emp in names:
    rest_day = random.choice(weekday_range)
    schedule_df.loc[emp, rest_day] = 'off'

# 第二步:逐天分配当班班次
for day in days:
    # 筛选当天需要到岗的员工
    on_duty = [emp for emp in names if pd.isna(schedule_df.loc[emp, day])]
    random.shuffle(on_duty) # 打乱员工顺序保证排班随机性
    # 随机确定早班人数,范围控制在1~2,同时保证晚班至少有1人到岗
    am_headcount = random.randint(1, min(2, len(on_duty)-1))
    # 拆分早、晚班人员名单
    am_staff = on_duty[:am_headcount]
    pm_staff = on_duty[am_headcount:]
    # 写入排班结果
    for emp in am_staff:
        schedule_df.loc[emp, day] = 'am'
    for emp in pm_staff:
        schedule_df.loc[emp, day] = 'pm'

# 打印输出最终排班表
print(schedule_df)

效果说明

  • 每次运行都会生成不同的随机排班结果
  • 所有员工的休息日都落在周一到周五,每人恰好1天休息
  • 任意一天的早班、晚班人数都不会超过2人
  • 周六周日不安排休息,自动拆分出2人一个班、1人一个班的组合,符合单班次人数上限要求

内容的提问来源于stack exchange,提问作者Bello Nasiff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:06:13