我想要使用python实现一个统计考勤打卡的功能,具体目标是统计一个人靠近上班和靠近下班的打卡时间并计算差值,如果他中途打卡离开,则只计算上班的那部分时间,你能给我设计一段代码逻辑流程吗
时间: 2024-02-17 17:03:46 浏览: 125
统计考勤python程序
当然可以,以下是一个简单的代码逻辑流程,供参考:
1. 读取考勤记录的文件,并将记录按照时间顺序排序。
2. 对于每个员工,遍历他的考勤记录。
3. 统计靠近上班的打卡时间和靠近下班的打卡时间。
4. 如果员工中途离开,只计算上班时间。
5. 计算靠近上班和靠近下班的时间差,并输出结果。
下面是一个示例代码:
```python
import csv
# 读取考勤记录文件
with open('attendance.csv') as f:
reader = csv.DictReader(f)
# 按时间升序排序
records = sorted(reader, key=lambda x: x['time'])
# 员工考勤记录字典,key为员工编号,value为考勤记录列表
employee_records = {}
# 遍历考勤记录
for record in records:
employee_id = record['employee_id']
punch_time = record['time']
# 如果员工编号不在字典中,则添加一个空的考勤记录列表
if employee_id not in employee_records:
employee_records[employee_id] = []
# 将考勤记录添加到员工的考勤记录列表中
employee_records[employee_id].append(punch_time)
# 遍历每个员工的考勤记录
for employee_id, records in employee_records.items():
start_time = None # 上班时间
end_time = None # 下班时间
total_time = 0 # 工作时间
# 遍历考勤记录
for i, record in enumerate(records):
# 如果是最后一条记录,则只计算上班部分时间
if i == len(records) - 1 and start_time is not None:
total_time += (record - start_time).seconds // 60
break
# 如果是第一条记录或者上一条记录是离开记录,则更新上班时间
if i == 0 or records[i - 1].startswith('Leave'):
start_time = record
# 如果是离开记录,则更新下班时间并计算时间差
elif record.startswith('Leave'):
end_time = record
total_time += (end_time - start_time).seconds // 60
# 重置上班时间和下班时间
start_time = None
end_time = None
# 输出结果
print(f'员工编号:{employee_id},工作时间:{total_time}分钟')
```
在上述代码中,首先读取考勤记录文件,并将记录按照时间升序排序,然后遍历每个员工的考勤记录,统计靠近上班和靠近下班的打卡时间,并计算时间差。如果员工中途离开,则只计算上班部分时间。最后输出结果。
阅读全文