Python 自动排班表格(代码分享)

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Python 自动排班表格(代码分享)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

文章目录

    • 前言
    • 问题描述
    • 解决步骤
      • 1、安装Python库
      • 2、生成班次列表
      • 3、班次安排
      • 4、调整班次安排
      • 5、安排全天值班和副值班
      • 6、生成Excel表格
    • 总结

前言

  在许多组织和企业中,排班是一个重要的管理任务。合理的排班安排不仅可以保证工作的正常进行,还可以提高员工的工作积极性和生产效率。然而,对于大型团队的排班来说,尤其是考虑到每个人的工作限制、休息时间以及特定人员之间的排班限制,排班问题变得异常复杂。

  在本篇博客中,我们将探讨如何使用Python编程语言来解决一个具体的排班问题。具体来说,我们将考虑一个包含19个人员的团队,需要进行早、中、夜三班以及全天值班的排班安排。同时,我们还需要满足每个人的工作限制,确保每个人的排班尽量均匀,并且避免特定人员在同一天出现在早、中、夜班。

  在本文中,我们将首先介绍排班问题的具体要求和限制条件,然后展示如何使用Python编程语言以及pandas库来解决这个复杂的排班问题。通过本文的学习,读者将能够了解如何利用编程技术解决实际的排班难题,为团队排班管理提供新的思路和方法。

问题描述

19个人自动排班表格,分早,中,夜三班和全天值班

  • 31天/月,共有19个人(分别为赵、钱、孙、李、周、吴、郑、王、冯、陈、褚、卫、蒋、沈、韩、杨、朱、秦、尤)
  • 早、中、夜班各1人,尤每月3板,其他人每月不低于5班,在排班过程中尽量均匀地分配班次给每个人。
  • 每天全天主值班、副值班,2名,每月至少3班。
  • 针对赵、钱;孙、李;周、吴;郑、王;冯、陈;不能在早、中、夜班同一天,在排班时特意将他们分开安排在不同班次。
  • 冯,5号-15号、陈,18号-25号休息不排班
  • 生成Excel表格

解决步骤

1、安装Python库

  首先,我们需要安装一个Python库,叫做pandas,它可以帮助我们处理Excel表格。你已经安装了pandas库吗?如果没有的话,你可以使用以下命令来安装它:

pip install pandas

2、生成班次列表

  安装完成后,我们需要确定每个人每天的班次。根据条件,每天有早、中、夜三个班次,每个班次需要安排一个人。我们可以使用一个列表来表示每天的班次,列表的长度为31,每个元素表示当天的班次,值为对应人员的编号。

shifts = [0] * 31  # 初始化班次列表,初始值为0# 确定每天的班次
for day in range(31):# 根据条件,确定当天的班次# 这里只是一个示例,具体的安排需要根据后续的条件来调整shifts[day] = day % 19 + 1print(shifts)

  这段代码会生成一个长度为31的班次列表,其中每个元素的值表示当天的班次,范围为1到19,对应着19个人员的编号。请运行这段代码并查看结果。

3、班次安排

  接下来,我们需要考虑每个人每月的班次安排。根据条件,尤每月需要排3班,其他人每月不低于5班。我们可以使用一个字典来记录每个人的班次安排情况。

import random# 19个人的姓名
names = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤']# 初始化班次字典
schedule = {name: [] for name in names}# 随机生成尤的班次安排
schedule['尤'] = random.sample(range(31), 3)# 其他人的班次安排
for name in names:if name != '尤':# 随机生成每个人的班次安排,这里只是一个示例,后续需要根据条件来调整schedule[name] = random.sample(range(31), 5)print(schedule)

  这段代码会生成一个字典,记录了每个人的班次安排情况。尤的班次安排使用了随机采样,其他人的班次安排也是随机生成的示例。接下来,我们需要根据条件来调整每个人的班次安排。

4、调整班次安排

  接下来,我们需要考虑每个人的班次安排满足条件。根据条件,我们需要确保每个人每月的班次不低于5班,尤每月需要排3班。此外,还需要考虑到一些人在特定日期需要休息不排班的情况。

  我们可以编写一个函数来调整每个人的班次安排,确保满足条件。这个函数需要考虑到每个人的已安排班次、休息日期以及尤的特殊安排。

def adjust_schedule(schedule):# 根据条件调整每个人的班次安排for name in schedule:if name == '尤':# 尤每月排3班schedule[name] = random.sample(range(31), 3)else:# 其他人每月不低于5班while len(schedule[name]) < 5:day = random.randint(0, 30)if day not in schedule[name]:  # 确保不重复安排同一天if day not in range(5, 16) and day not in range(18, 26):  # 确保不是冯、陈休息的日期schedule[name].append(day)return schedule# 调整班次安排
adjusted_schedule = adjust_schedule(schedule)
print(adjusted_schedule)

  这段代码定义了一个调整班次安排的函数,并对每个人的班次安排进行了调整。在调整过程中,考虑了尤的特殊安排和冯、陈的休息日期。请运行这段代码并查看结果。

  接下来,我们需要考虑如何满足条件4,即确保特定人员不在同一天同时安排在早、中、夜班。我们可以编写一个函数来检查并调整班次安排,确保满足这个条件。

def adjust_shifts_for_condition4(schedule):# 针对条件4,调整班次安排for day in range(31):# 获取当天的班次安排shifts_on_day = [schedule[name][day] if day < len(schedule[name]) else None for name in schedule]# 检查是否有特定人员在同一天同时安排在早、中、夜班for group in [['赵', '钱'], ['孙', '李'], ['周', '吴'], ['郑', '王'], ['冯', '陈']]:if all(shifts_on_day) and all(name in shifts_on_day for name in group):# 如果有特定人员在同一天同时安排在早、中、夜班,则随机调整其中一个人的班次name_to_adjust = random.choice(group)available_days = [i for i in range(31) if i not in schedule[name_to_adjust]]  # 找到该人还未安排班次的日期new_day = random.choice(available_days)schedule[name_to_adjust][day] = new_dayreturn schedule# 调整班次安排满足条件4
adjusted_schedule = adjust_shifts_for_condition4(adjusted_schedule)
print(adjusted_schedule)

  这段代码定义了一个函数来调整班次安排,确保满足条件4。在调整过程中,我们检查每天的班次安排,如果有特定人员在同一天同时安排在早、中、夜班,就随机调整其中一个人的班次。请运行这段代码并查看结果。

5、安排全天值班和副值班

  接下来,我们需要考虑全天值班和副值班的安排。根据条件,每天需要安排2名人员进行全天值班和副值班,每月至少3班。我们可以编写一个函数来满足这个条件。

def assign_all_day_shifts(schedule):# 统计每个人每月的班次数量monthly_shifts = {name: len(schedule[name]) for name in schedule}# 安排全天值班和副值班for day in range(31):# 统计当天已安排的班次shifts_on_day = [schedule[name][day] if day < len(schedule[name]) else None for name in schedule]# 如果当天没有全天值班,找到两个人安排全天值班和副值班if '全天值班' not in shifts_on_day:# 找到全天值班和副值班的人员available_people = [name for name, shifts in monthly_shifts.items() if shifts < 5 and day not in schedule[name]]if len(available_people) >= 2:all_day_shift, vice_shift = random.sample(available_people, 2)schedule[all_day_shift].append(day)schedule[vice_shift].append(day)monthly_shifts[all_day_shift] += 1monthly_shifts[vice_shift] += 1return schedule# 安排全天值班和副值班
final_schedule = assign_all_day_shifts(adjusted_schedule)
print(final_schedule)

  这段代码定义了一个函数来安排全天值班和副值班,确保每天有两名人员进行值班,并且每月至少有3天值班。在安排过程中,我们考虑了每个人每月的班次数量,并确保安排的合理性。请运行这段代码并查看结果。

6、生成Excel表格

  最后,我们需要将排班结果导出到Excel表格中。我们可以使用 pandas 库来实现这一步。

import pandas as pd# 创建一个空的数据框
df = pd.DataFrame(columns=['Date', 'Shift', 'Person'])# 填充数据框
for name, shifts in final_schedule.items():for day, shift in enumerate(shifts):if shift is not None:df = df.append({'Date': day + 1, 'Shift': shift, 'Person': name}, ignore_index=True)# 将数据框导出到Excel表格
df.to_excel('shift_schedule.xlsx', index=False)

  这段代码使用 pandas 库创建了一个数据框,并将排班结果填充到数据框中,然后将数据框导出到Excel表格中。请运行这段代码,你将得到一个名为 shift_schedule.xlsx 的Excel表格,其中包含了最终的排班结果。

总结

  通过本文的学习,我们深入探讨了如何利用Python编程语言和pandas库来解决复杂的排班问题。在具体的排班问题中,我们面临着诸多挑战,包括每个人的工作限制、休息时间安排、特定人员之间的排班限制等。然而,通过合理的算法设计和编程实现,我们成功地解决了这一复杂的排班难题。

  在解决排班问题的过程中,我们不仅学习了如何使用Python编程语言进行逻辑设计和算法实现,还深入理解了pandas库在处理Excel表格和日期数据方面的强大功能。通过递归算法和逻辑判断,我们成功地生成了满足各项要求的排班表格,并将结果保存为Excel文件,为团队的排班管理提供了实用的解决方案。

  总之,本文展示了如何将编程技术应用于实际的排班管理问题中,为排班管理提供了新的思路和方法。通过合理的算法设计和编程实现,我们能够更加高效地解决复杂的排班难题,为团队的工作安排和管理提供更加科学、合理的方案。

  希望本文能够为读者提供有益的启发,激发大家对于排班管理的思考和探索。在未来的工作中,我们可以进一步完善和优化排班算法,为团队的工作安排和管理提供更加智能、高效的解决方案。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS安装NVIDIA驱动、CUDA以及nvidia-container-toolkit

0.提前准备 0.1.更新yum源&#xff08;以阿里为例&#xff09; 0.1.1 备份当前的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 0.1.2 下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base…

ORM框架简介

什么是ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一种编程技术&#xff0c;用于在关系数据库和对象程序语言之间转换数据。ORM框架允许开发者以面向对象的方式来操作数据库&#xff0c;而不需要编写复杂的SQL语句。简单…

【Linux】命令行下的增删查改之“查看”

致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 头部内容获取(head) head命令的功能是显示文件开头的内容&#xff0c;默认值为前10行。 指令参数&#xff1a; -n 定义显示行数 -c 指定显示头部内容的字符数 -v 总是显示文件名的头信…

告别手动计数:智能统计模型用量,释放设计潜力

添加HanTop-MKT&#xff0c;免费获取统计零件数量模型 非标设备行业的设计BOM因为涉及物料采购与装配数量要求&#xff0c;往往面临着需要数据准确性的严格要求&#xff0c;在缺乏自动化工具情况下&#xff0c;手动统计零件用量变得更加困难&#xff0c;且数据准确性得不到保障…

【uniapp】设置公共样式,实现公共背景等

目录 1、 全局渐变背景色 2.1 创建common目录 2.2 在common下新建style和images等目录 2.3 在style下新建common-style.scss 2.4 common-style输入全局渐变颜色 2.5 引入样式 2.6 业务页面引入 2.7 展示 2、全局字体颜色 2.1 新建base-style.scss文件 2.2 设置base-…

07 django管理系统 - 部门管理 - 搜索部门

在dept_list.html中&#xff0c;添加搜索框 <div class"container-fluid"><div style"margin-bottom: 10px" class"clearfix"><div class"panel panel-default"><!-- Default panel contents --><div clas…

Redis 其他类型 渐进式遍历

我们之前已经学过了Redis最常用的五个类型了&#xff0c;然而Redis还有一些在特定场景下比较好用的类型 Redis最关键的五个数据类型&#xff1a; 上面的类型是非常常用&#xff0c;很重要的类型。 除此之外的其他类型不常用&#xff0c;只是在特定的场景能够发挥用处&#…

无极低码课程【java(jdk)windows下安装及环境变量配置】

在Windows环境中安装JDK 7教程 Java Development Kit (JDK) 是开发Java应用程序所必需的工具包。本教程将指导您在Windows操作系统上安装JDK 7。 准备工作 下载JDK 7安装包 访问 Oracle官方网站 下载JDK 8的安装包。选择适合您操作系统的安装包(例如 jdk-7u80-windows-x64.ex…

vmware虚拟机 报错:客户机操作系统已禁用 CPU,请关闭或重置虚拟机 的解决方法

打开cpu虚拟化全部进行勾选 ctrl e 进行关机 勾选上打开就好了 如果没有那个选项 关机>打开虚拟机>管理>更改硬件兼容性> 往小处改改> >更改此虚拟机

[LeetCode] 515. 在每个树行中找最大值

题目描述&#xff1a; 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,10…

基于SpringBoot的个性化健康建议平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于智能推荐的卫生健康系统的相关信息成为…

OpenTrans

比较的方法Cat-Seg不好复现

Spring 实现 3 种异步流式接口,干掉接口超时烦恼

大家好&#xff0c;我是小富&#xff5e; 如何处理比较耗时的接口&#xff1f; 这题我熟&#xff0c;直接上异步接口&#xff0c;使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性&#xff0c;处理结果仅返回单个值。在某…

幸运7游戏模拟 python

题目&#xff1a; 幸运"7"游戏,用计算机模拟掷骰子的过程&#xff0c;测算两个骰子点数之和为7的概率。 游戏规则是你丢两个骰子&#xff0c;如果其点数之和为7你就赢4元&#xff0c;不是7你就输1元。 假设你刚开始有10元&#xff0c;当全部输掉为0元的时候游戏结…

【网络安全】1,600$:Auth0 错误配置

未经许可,不得转载。 文章目录 前言正文漏洞案例修复建议前言 Auth0 是一个广泛用于网站和应用程序的身份验证平台,负责管理用户身份并确保其服务的安全访问。该平台提供了多种工作流程,以无缝集成登录和注册流程。 在 Auth0 中创建新应用时,注册选项默认启用。当系统禁用…

Android 无Bug版 多语言设计方案!

出海业务为什么要做多语言&#xff1f; 1.市场扩大与本地化需求&#xff1a; 通过支持多种语言&#xff0c;出海项目可以触及更广泛的国际用户群体&#xff0c;进而扩大其市场份额。 本地化是吸引国际用户的重要策略之一&#xff0c;而语言本地化是其中的核心。使用用户的母语…

c语言字符函数

1&#xff0c;字符分类函数&#xff1a; 例如&#xff1a;写一个代码将字符串中的小写字母转化成大写字母 就可以用到上述islower函数判断字符是否是小写 2.字符转换函数 c语言提供了两个字符转换函数 1.int tolower (int c); //将输入进去的大写字母转化成小写 2,int …

IRP默认最小流程

IRP是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时&#xff0c;应用程序会发出I/O请求&#xff0c;操作系统将相应的I/O请求转换成相应的IRP&#xff0c;不同的IRP会根据类型被分派到不同的派遣例程中进行处理。 irp相当于R3下的消息&#xff0c…

rtsp协议:rtsp协议参数介绍

目的&#xff1a; 实时流协议&#xff08;RTSP&#xff09;用于建立和控制单个或多个时间同步的连续媒体流&#xff0c;例如音频和视频。RTSP 通常不负责实际传输这些连续的媒体流&#xff0c;但可以将连续媒体流与控制流进行交错传输&#xff08;参见第 10.12 节&#xff09;。…

学习Redisson实现分布式锁

官网&#xff1a;https://redisson.org/ 官方文档&#xff1a;https://redisson.org/docs/getting-started/ 官方中文文档&#xff1a;https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 1、引入依赖 <!--redisson--> <dependency><groupId>or…