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

news2024/11/30 6:02:25

在这里插入图片描述

✅作者简介: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 + 1

print(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_day

    return 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] += 1
                monthly_shifts[vice_shift] += 1

    return 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.coloradmin.cn/o/2215527.html

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

相关文章

前端reactvue3——实现滚动到底加载数据

文章目录 ⭐前言⭐react 实现滚动加载⭐vue3 实现滚动加载⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 前端react&vue3——实现滚动加载&#xff08;到底部加载&#xff09; scrollTop 属性 一个双精度浮点值&#xff0c;表示元素当前从原点垂直…

全国41G带高度的矢量建筑楼块

建筑数据用于精确描述建筑物的空间位置和范围&#xff0c;支持城市规划、灾害管理、房地产开发及各类空间分析等多领域应用。 数据介绍 带有高度的建筑数据在气候建模、能耗分析及社会经济活动等多种应用中起着至关重要的作用。 尽管这些信息至关重要&#xff0c;但以往的研…

入门必备:什么是鸿蒙系统

鸿蒙系统(HarmonyOS)是华为公司发布的一款基于微内核的面向全场景的分布式操作系统。以下是对它的具体介绍&#xff1a; 1. 核心特点: • 分布式能力&#xff1a;这是鸿蒙系统的核心优势之一。它能够将多种不同类型的智能终端设备连接起来&#xff0c;使这些设备在系统层面相…

MySQL数据的导出

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

MySQL中什么情况下类型转换会导致索引失效

文章目录 1. 问题引入2. 准备工作3. 案例分析3.1 正常情况3.2 发生了隐式类型转换的情况 4. MySQL隐式类型转换的规则4.1 案例引入4.2 MySQL 中隐式类型转换的规则4.3 验证 MySQL 隐式类型转换的规则 5. 总结 如果对 MySQL 索引不了解&#xff0c;可以看一下我的另一篇博文&…

Hadoop集群安装

集群规划 node01node02node03角色主节点从节点从节点NameNode√DataNode√√√ResourceManager√NodeManager√√√SecondaryNameNode√Historyserver√ 上传安装包到node01 解压到指定目录 tar -zxvf /bigdata/soft/hadoop-3.3.3.tar.gz -C /bigdata/server/ 创建软链接 cd…

在线matlab环境

登陆https://ww2.mathworks.cn/ 在线文档https://ww2.mathworks.cn/help/index.html 在线环境[需要先登陆]

C4T避风型电动采光排烟天窗(图集09J621-2)

C4T避风型电动采光排烟天窗是09J621-2《电动采光排烟天窗》图集中的一种窗型。也是一种现代化的建筑消防排烟通风采光设备&#xff0c;被广泛应用于多风地区厂房。 C4T避风型电动采光排烟天窗配有成品避风罩&#xff0c;该避风置由钢制骨架和彩色钢板构成&#xff0c;固定在电动…

50 | 装饰器模式:通过剖析Java IO类库源码学习装饰器模式

上一篇文章我们学习了桥接模式&#xff0c;桥接模式有两种理解方式。第一种理解方式是“将抽象和实现解耦&#xff0c;让它们能独立开发”。这种理解方式比较特别&#xff0c;应用场景也不多。另一种理解方式更加简单&#xff0c;类似“组合优于继承”设计原则&#xff0c;这种…

openEuler、Linux操作系统常见操作-(6)如何登录Linux

如何登录Linux Linux登陆方式主要有如下两种: 。本地登陆 。一个典型的Linux系统将运行六个虚拟控制台和一个图形控制台&#xff0c;openEuler目前暂未支持图形化界面; 可以通过CtrlAltF[1-6]在6个虚拟控制台之间进行切换。 远程登录 。默认情况下openEuler支持远程登录&…

制作PPT的入门步骤有哪些?2个高效软件轻松搞定PPT!

对于现代的职场人士和学生来说&#xff0c;PPT——PowerPoint已经成为他们工作和学习无法避开的部分&#xff0c;换到各种商业会议、学术报告和教学中&#xff0c;PPT演示文稿都扮演着重要的角色&#xff1a;不仅能够帮助演讲者更好地展示讲义内容&#xff0c;更让观众能够通过…

JavaScript全面指南(四)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript全面指南 目录 61、如何防止XSRF攻击 62、如何判断一个对象是否为数组&…

科研绘图系列:R语言散点相关系数图(scatter plot)

文章目录 介绍加载R包数据函数画图系统信息介绍 散点相关系数图是一种数据可视化图表,它结合了散点图和相关系数来展示两个连续变量之间的关系。这种图表通常用于相关性分析,以判断两个变量之间是否存在某种关联,并总结坐标点的分布模式。 在散点相关系数图中,横轴和纵轴…

SpringBoot+Vue+Uniapp智能社区服务小程序系统(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

截图贴图工具 | PixPin v1.9.0 绿色版

PixPin是一款功能强大且使用简单的截图和贴图工具&#xff0c;它旨在帮助用户提高工作效率。PixPin的主要功能包括截图、贴图、标注、文本识别、长截图和截动图。它允许用户自由选择或自动探测窗口来设定截图范围&#xff0c;精准截取所需内容&#xff0c;并将所截取的图像“贴…

D37【python 接口自动化学习】- python基础之函数

day37 函数的参数 学习日期&#xff1a;20241014 学习目标&#xff1a;输入输出与文件操作&#xfe63;-50 函数的参数&#xff1a;怎样实现函数与外部数据通信&#xff1f; 学习笔记&#xff1a; 实参与形参 代码实现 # 实参与形参 def foo(number):print(number)n1123 n…

redis与springBoot整合

前提 要实现,使用Redis存储登录状态 需要一个完整的前端后端的项目 前端项目搭建 解压脚手架 安装依赖 配置请求代理 选做: 禁用EsLint语法检查 Vue Admin Template关闭eslint校验&#xff0c;lintOnSave&#xff1a;false设置无效解决办法_lintonsave: false-CSDN博客 …

【前端】如何制作一个简单的网页(3)

接下来我们为html元素添加网页内容。网页内容按照功能的不同可以区分为网页头与网页体两个部分。 先来说说什么是网页头。 网页头 网页头&#xff08;又称为网页头部信息&#xff09;向浏览器提供文档的一些信息。 这些信息包括网页的名称、编码方式、样式、JS代码等。 &…

java项目之纺织品企业财务管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的纺织品企业财务管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于spring boot…

Thread类的基本用用法

1.创建线程 1.1继承Thread类 线程创建需要Thread类但是不需要import导入是为什么&#xff1f; 因为java.lang默认import不需要导入&#xff0c;java.lang中包含Thread 为什么在MyThread类中只能使用try catch 无法使用throws&#xff1f; 因为父类Thread run中没有throws …