我是图书馆管理者平常很多人值班遇到有人请假、换班我需要改值班表而且请假、换班需要我的审批审批通过后才能换班、请假如果不通过则需要返回重做。需要用Python写一个图书馆志愿者值班、换班、调班、请假的代码尽可能详细我有日常值班表是表格我需要直接导入表格你在代码上要进行标注说明每一步是干啥的
![我是图书馆管理者平常很多人值班遇到有人请假、换班我需要改值班表而且请假、换班需要我的审批审批通过后才能换班、请假如果不通过则需要返回重做。需要用Python写一个图书馆志愿者值班、换班、调班、请假的代码尽可能详细我有日常值班表是表格我需要直接导入表格你在代码上要进行标注说明每一步是干啥的 我是图书馆管理者平常很多人值班遇到有人请假、换班我需要改值班表而且请假、换班需要我的审批审批通过后才能换班、请假如果不通过则需要返回重做。需要用Python写一个图书馆志愿者值班、换班、调班、请假的代码尽可能详细我有日常值班表是表格我需要直接导入表格你在代码上要进行标注说明每一步是干啥的](https://img.cveoy.top/0/A725863CAFB0DA8F5B9A6C6EBB3F24F1.webp)
首先,我们需要安装pandas库和openpyxl库,用于读取和处理Excel表格。
# 安装pandas和openpyxl库
!pip install pandas
!pip install openpyxl
然后,我们可以读取日常值班表格,这里假设表格文件名为"值班表.xlsx",并且表格中的第一个工作表为"值班表"。
import pandas as pd
# 读取Excel表格
df = pd.read_excel('值班表.xlsx', sheet_name='值班表')
接下来,我们可以定义一些函数来实现值班、换班、调班、请假等操作。
首先,我们定义一个函数来查询某个志愿者是否在某个时间段内有值班。
def check_duty(df, volunteer, start_time, end_time):
"""
查询志愿者在某个时间段内是否有值班
df: 值班表DataFrame
volunteer: 志愿者姓名
start_time: 开始时间
end_time: 结束时间
返回值: True代表有值班,False代表没有值班
"""
duty = df[(df['姓名'] == volunteer) & (df['开始时间'] <= end_time) & (df['结束时间'] >= start_time)]
if len(duty) > 0:
return True
else:
return False
然后,我们定义一个函数来查询某个时间段内所有可用的志愿者,即未在此时间段内值班的志愿者。
def get_available_volunteers(df, start_time, end_time):
"""
查询某个时间段内可用的志愿者
df: 值班表DataFrame
start_time: 开始时间
end_time: 结束时间
返回值: 可用志愿者列表
"""
volunteers = list(df['姓名'].unique())
available_volunteers = []
for volunteer in volunteers:
if not check_duty(df, volunteer, start_time, end_time):
available_volunteers.append(volunteer)
return available_volunteers
接下来,我们定义一个函数来添加一条值班记录。
def add_duty(df, volunteer, start_time, end_time):
"""
添加一条值班记录
df: 值班表DataFrame
volunteer: 志愿者姓名
start_time: 开始时间
end_time: 结束时间
"""
new_row = {'姓名': volunteer, '开始时间': start_time, '结束时间': end_time}
df = df.append(new_row, ignore_index=True)
return df
然后,我们定义一个函数来删除一条值班记录。
def delete_duty(df, index):
"""
删除一条值班记录
df: 值班表DataFrame
index: 要删除的行数
"""
df = df.drop(index, axis=0)
return df
接下来,我们可以定义一个函数来实现换班操作。
def exchange_duty(df, index1, index2):
"""
换班操作
df: 值班表DataFrame
index1: 要交换的第一条值班记录的行数
index2: 要交换的第二条值班记录的行数
"""
row1 = df.loc[index1]
row2 = df.loc[index2]
volunteer1 = row1['姓名']
start_time1 = row1['开始时间']
end_time1 = row1['结束时间']
volunteer2 = row2['姓名']
start_time2 = row2['开始时间']
end_time2 = row2['结束时间']
# 判断两个志愿者是否在对方的值班时间内有其他值班安排
if check_duty(df, volunteer1, start_time2, end_time2) or check_duty(df, volunteer2, start_time1, end_time1):
print('换班失败,两个志愿者在对方的值班时间内有其他值班安排')
return df
else:
df.loc[index1, '姓名'] = volunteer2
df.loc[index1, '开始时间'] = start_time2
df.loc[index1, '结束时间'] = end_time2
df.loc[index2, '姓名'] = volunteer1
df.loc[index2, '开始时间'] = start_time1
df.loc[index2, '结束时间'] = end_time1
print('换班成功')
return df
最后,我们定义一个函数来实现请假操作。
def leave_duty(df, index, start_time, end_time):
"""
请假操作
df: 值班表DataFrame
index: 要请假的行数
start_time: 开始时间
end_time: 结束时间
"""
volunteer = df.loc[index, '姓名']
# 判断请假时间段内是否有其他值班安排
if check_duty(df, volunteer, start_time, end_time):
print('请假失败,此时间段内已有其他值班安排')
return df
else:
df = delete_duty(df, index)
available_volunteers = get_available_volunteers(df, start_time, end_time)
if len(available_volunteers) == 0:
print('请假失败,此时间段内没有可用志愿者')
df = add_duty(df, volunteer, start_time, end_time)
return df
else:
new_volunteer = available_volunteers[0]
df = add_duty(df, new_volunteer, start_time, end_time)
print('请假成功,已安排%s代替%s值班' % (new_volunteer, volunteer))
return df
现在,我们可以编写一个主函数来测试以上函数。
# 定义主函数
def main():
# 读取Excel表格
df = pd.read_excel('值班表.xlsx', sheet_name='值班表')
# 打印当前值班表
print(df)
# 添加一条值班记录
df = add_duty(df, '张三', '2022-01-01 08:00:00', '2022-01-01 12:00:00')
# 打印添加后的值班表
print(df)
# 删除一条值班记录
df = delete_duty(df, 0)
# 打印删除后的值班表
print(df)
# 换班操作
df = exchange_duty(df, 0, 1)
# 打印换班后的值班表
print(df)
# 请假操作
df = leave_duty(df, 0, '2022-01-01 08:00:00', '2022-01-01 12:00:00')
# 打印请假后的值班表
print(df)
# 调用主函数
main()
以上代码可以实现基本的值班、换班、调班、请假功能,但仍有很多细节需要考虑,例如请假时如何处理连续值班的问题、换班时如何处理多个志愿者之间的交换等等,需要根据实际情况进行改进。
原文地址: https://gggwd.com/t/topic/b7z4 著作权归作者所有。请勿转载和采集!