说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
今天的案例,也是我们日常中会遇到的问题,它是办公自动化需求。假定在个工作组,采用排班到岗制度,规则大体是设定一个排班次序,首次正常排班,往后后边的两位连续再工作一个班次,往后一直按此逻辑进行。
假定有 a 到 h 共 8 个员工,他们排班的次序也是从 a 到 h,就有列表:
lst = [*'abcdefgh']
lst
# ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
每次有四人上班,每次后边的两位接着再上一次,即排班依次为:
'''
abcd
cdef
efgh
ghab
abcd
...
'''
现在我们要排出2022年05月的排班表(无节假日)。
我们可以充分利用列表的有序性以及可操作性,每次排班用切片在列表中切出四个人,切完后:
这样得到一个新的列表,列表在开头是本次排完的后两个,前两个加入下次排班。
简单理解,切片操作不变列表变化,每次排班前边两位上过班的移到最后等待后续排班。
得到排班数据后,我们用 pandas 的 DataFrame 将数据存储导出,将日期构造到索引。
导入要用的 pandas,然后编写个这个排班数据生成函数,将排班天数作为参数:
import pandas as pd
def gen_data(n):
data = [] # 存入每次排班的数据
lst = [*'abcdefgh'] # 原始员工及顺序数据
for i in range(n):
data.append(lst[:4]) # 排班,排进4人
lst.extend(lst[:2]) # 前两个人追加到列表后总
del lst[:2] # 删除前两个,下次就不从他们排了
return data
构造数据到 DataFrame:
df = pd.DataFrame(gen_data(30),
index=pd.date_range('20220501', periods=30)
)
'''
0 1 2 3
2022-05-01 a b c d
2022-05-02 c d e f
2022-05-03 e f g h
2022-05-04 g h a b
2022-05-05 a b c d
2022-05-06 c d e f
2022-05-07 e f g h
...
2022-05-29 a b c d
2022-05-30 c d e f
'''
最后导出数据:
df.to_excel('排班-202205.xlsx')
这样,我们就完成了需求。
(完)
更新时间:2024-08-18 16:33:44 标签:python pandas 排班 列表