python办公自动化(二)

将打卡表,请假表处理为考勤表:
考勤表要求:
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.将员工当天请假外出记录按日附到考勤表中
五六七要求需要和两外两个表进行数据抽取并合并,因为牵扯到格式不统一及知识较少,未进行制作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值