将打卡表,请假表处理为考勤表:
考勤表要求:
1.表格按部门排列
2.记录员工上班卡打卡时间与下班卡打卡时间
员工当日第一个打卡数据计为上班卡,最早打卡时间9:00,不能早于9:00
当日最后一个打卡数据计为下班卡,下班卡时间不超过23:59分
如当日只有一个打卡时间,计为上班卡,下班卡计为“缺卡”
3.记录当日星期几
4.记录当日出勤总时长
此次问题的主要难点在于时间的处理,通过这次训练学到了很多
import pandas as pd
import datetime
import warnings
warnings.filterwarnings('ignore')
data = pd.read_excel('202011打卡记录.xls')
def zhuanhuan(x):
return x.strftime("%Y-%m-%d") # 以时间元组,并返回以可读字符串表示的当地时间,格式由参数 format 决定。
def xingqi(x):
return datetime.datetime.strptime(x, "%Y-%m-%d").weekday() + 1 #根据指定的格式把一个时间字符串解析为时间元组,加1的原因主要是因为在星期里0表示周一,
data['日期'] = data.iloc[:, 3].apply(zhuanhuan) # 时间转化为字符串
namegroup = data.groupby(data['姓名']).size().index # 通过分组后取出索引的方式姓名去重
df_sum = pd.DataFrame()
for i in namegroup:
data_new = data[data['姓名'] == i] # 先按照名字取出数据
groupdate = data_new.groupby(data['日期']).size().index # 对日期进行分组,因为一个人一天有多组数据,单独分离出某人某天数据
for j in groupdate: # 按日期取数据
df = pd.DataFrame()
data_new1 = data_new[data_new['日期'] == j]
cha = '09:00:00' # 判断九点
he = j + ' ' + cha # 字符串组合
hetime = datetime.datetime.strptime(he, "%Y-%m-%d %H:%M:%S") # 字符串转日期
data_new1 = data_new1[data_new1['日期时间']>hetime] # 时间必须晚于九点
data_new1['上班'] = '' # 增加新列用于数据判断
data_new1['下班'] = ''
if data_new1.empty: # 某人这一天可能是空数据,即出差时不打卡
pass
else: # 非空时处理数据
if len(data_new1) == 1: #某人某天只有一组数据
data_new1.iloc[0, 9] = '上班'
data_new1.iloc[0, 10] = '缺卡'
df = pd.concat([df, data_new1], axis=1) 此人的数据添加一次
else:
for m in range(len(data_new1)): # 某人某天多组数据
if data_new1.iloc[m, :]['日期时间'] == data_new1['日期时间'].min(): # 时间最小值设为上班打卡时间
data_new1.iloc[m, 9] = '上班'
df = pd.concat([df, data_new1.iloc[m, :]], axis=1)
elif data_new1.iloc[m, :]['日期时间'] == data_new1['日期时间'].max(): # 时间最大值设为下班打卡时间
data_new1.iloc[m, 10] = '下班'
df = pd.concat([df, data_new1.iloc[m, :]], axis=1)
df = df.T # 转置
df['星期'] = df['日期'].apply(xingqi) # 判断这一天周几
df['总时长'] = df['日期时间'].max() - df['日期时间'].min() # 判断某人某天工作时长
df_sum = pd.concat([df_sum, df], axis=1)
df_sum = df_sum.sort_values(by='部门') # 根据部门排序
df_sum.to_csv('00sum.csv', encoding='utf-8')
此次项目的难点在于理清先后顺序、逻辑关系及时间处理方式。程序运行时间过长,原因可能是pandas结构,numpy结构或许运行更快
还有以下要求未完成:
5.记录当日出勤状态:
广州研发中心与质量部,当日出勤总时长满9小时计为正常出勤,少于9小时计为缺勤,高于11小时计为加班
其他部门:上班卡晚于9:30计为迟到,下班早于18:00计为早退,出勤低于9小时计为缺勤,高于11小时计为加班
6.记录加班时长:
出勤时长11小时计为加班1小时,最低加班时长1小时,最小加班单位为0.5小时
7.将员工当天请假外出记录按日附到考勤表中
五六七要求需要和两外两个表进行数据抽取并合并,因为牵扯到格式不统一及知识较少,未进行制作。