如果没有钉钉这种打卡软件可以帮你统计考勤数据,而且考勤机导出的数据只有员工打卡时间时,可以利用python编写一个自动统计的脚本,加快办公效率

实现的几个功能:

1、按月统计出勤,早退,迟到等常见指标

2、对源数据进行了清洗加工,尤其对一天内重复打卡的情况进行处理

3、抽取出异常记录(忘记打卡),便于排查异常原因

附带完整源码~

# -*- coding: utf-8 -*-
"""
Created on Wed Aug 25 16:10:46 2021@author: Administrator
"""import pandas as pd
import datetime
import os
import time# %%def get_week_day(date):week_day = {0: '一',1: '二',2: '三',3: '四',4: '五',5: '六',6: '日'}day = date.weekday()return week_day[day]def get_monringORafternoon(date):current_time = date.hourif current_time <= 12:return '上午'else:return '下午'def lateForWork(df):return (df['AMPM'] == '上午') & (df['Time'].apply(lambda x: datetime.time.strftime(x, "%H:%M:%S")) > '09:00:00')def leaveEarly(df):return (df['AMPM'] == '下午') & (df['Time'].apply(lambda x: datetime.time.strftime(x, "%H:%M:%S")) < '18:00:00')def severelyLate(df):return (df['AMPM'] == '上午') & (df['Time'].apply(lambda x: datetime.time.strftime(x, "%H:%M:%S")) > '09:10:00')def workOnSunday(df):return (df['week_day'] == '日')def eveningWork(df):return (df['AMPM'] == '下午') & (df['Time'].apply(lambda x: datetime.time.strftime(x, "%H:%M:%S")) >= '20:00:00')def weekends_between(d1,d2):days_between = (d2-d1).daysweekends, leftover = divmod(days_between,7)if leftover:start_day = (d2-datetime.timedelta(leftover)).isoweekday()end_day = start_day+leftover
#    if start_day<=6 and end_day>6:
#      weekends +=.5
#    if start_day<=7 and end_day>7:
#      weekends +=.5if start_day<=7 and end_day>7: #上面是算周末,现在是只算周日weekends +=1return weekends# %%
def main():at = time.time()path = os.getcwd()print('-'*20)print(f'已打开文件夹{path} ,正在读取内容...')print('-'*20)dirs = os.listdir(path)excel_list = [i for i in dirs if i.endswith('xls')]if len(excel_list)==0:input(f'没有找到xls文件,请将需要处理的文件放入{path},检查后重新启动程序')elif len(excel_list)>1:for i in enumerate(excel_list):print(i)try:excel_file = excel_list[int(input('发现有多个xls文件,输入想要统计的文件对应的编号:'))]except:print('没有找到此编号')input()else:excel_file = excel_list[0]print('-'*20)print('正在处理: ',excel_file)print('-'*20)data = pd.read_excel(path+'\\'+excel_file)if data.columns[0]!='ID de Usuario':df = pd.read_excel(path+'\\'+excel_file,header=8)data = df.loc[:,['ID de Usuario', 'Nombre Completo', 'Fecha/Hora']]data.columns = ['ID de Usuario','Nombre','Tiempo'] #统一叫法data=data[~(data['Nombre'].isnull())] #删掉空行data['Tiempo'] = pd.to_datetime(data['Tiempo'])data['Year'] = data['Tiempo'].dt.yeardata['Month'] = data['Tiempo'].dt.monthdata['Day'] = data['Tiempo'].dt.daydata['Time'] = data['Tiempo'].dt.timedata['week_day'] = data['Tiempo'].apply(get_week_day)data['AMPM'] = data['Tiempo'].apply(get_monringORafternoon)# %% 剔除重复打卡(上午最早一条,下午最晚一条)df_temp_day = data.drop_duplicates(['ID de Usuario', 'Nombre', 'Year', 'Month', 'Day'])df_temp_AM = data.loc[data['AMPM'] == '上午'].sort_values('Tiempo').drop_duplicates(subset=['ID de Usuario', 'Nombre', 'Year', 'Month', 'Day', 'AMPM'], keep='first')df_temp_PM = data.loc[data['AMPM'] == '下午'].sort_values('Tiempo').drop_duplicates(subset=['ID de Usuario', 'Nombre', 'Year', 'Month', 'Day', 'AMPM'], keep='last')df_dropdup = pd.concat([df_temp_AM, df_temp_PM], ignore_index=True).sort_values(['ID de Usuario', 'Tiempo'])# %% 迟到 早退 严重迟到 周日加班 晚上加班df_dropdup['迟到'] = lateForWork(df_dropdup).astype(int)df_dropdup['早退'] = leaveEarly(df_dropdup).astype(int)df_dropdup['严重迟到'] = severelyLate(df_dropdup).astype(int)df_dropdup['周日加班'] = workOnSunday(df_dropdup).astype(int)*0.5df_dropdup['晚上加班'] = eveningWork(df_dropdup).astype(int)# %% 异常gp_timecount = df_dropdup.groupby(['ID de Usuario', 'Nombre', 'Year', 'Month', 'Day'])['Time'].count()exceptionRecord = gp_timecount[gp_timecount == 1].reset_index()exceptionRecord.rename({'Time': '异常'}, axis=1, inplace=True)  # 异常记录gp_abnormal = exceptionRecord.groupby(['ID de Usuario', 'Nombre', 'Year', 'Month'])['异常'].count().reset_index()# %% 周日天数gp_tiempo=df_dropdup.groupby(['ID de Usuario', 'Nombre', 'Year', 'Month'])['Tiempo'].agg(['min','max'])sundayCount=gp_tiempo.apply(lambda x:weekends_between(x['min'],x['max']),axis=1).reset_index()sundayCount.columns = ['ID de Usuario', 'Nombre', 'Year', 'Month', '周日天数']# %% 统计汇总gp_count = df_temp_day.groupby(['ID de Usuario', 'Nombre', 'Year', 'Month'])['Day'].count()gp_sum = df_dropdup.groupby(['ID de Usuario', 'Nombre', 'Year', 'Month'])['迟到', '早退', '严重迟到', '周日加班', '晚上加班'].sum()gp_result = pd.concat([gp_count, gp_sum], axis=1).reset_index()gp_result.rename({'Day': '出勤天数'}, axis=1, inplace=True)# 添加“异常”列gp_result2 = pd.merge(gp_result, gp_abnormal, how='left').fillna(0)# 添加周日天数辅助计算出勤天数  出勤天数= 实际出勤-周日加班+周日天数gp_result2 = pd.merge(gp_result, sundayCount, how='left').fillna(0)# 校正出勤天数gp_result2['出勤天数'] = gp_result2['出勤天数']-gp_result2['周日加班']+gp_result2['周日天数']# 删除辅助列,若有计算疑问可注释该列gp_result2.drop('周日天数',axis=1,inplace=True)# %% 导出file_name = path+'\\'+'【result】'+excel_filewith pd.ExcelWriter(file_name) as writer:gp_result2.to_excel(writer,sheet_name='统计结果',index=False)data.to_excel(writer,sheet_name='源数据',index=False)df_dropdup.to_excel(writer,sheet_name='加工数据',index=False)exceptionRecord.to_excel(writer,sheet_name='异常记录',index=False)print('Time used: {} sec'.format(time.time()-at))input(f'数据已跑完,文件保存在{file_name}\n按enter键即可退出')#%%if __name__ == '__main__':try:main()except Exception as e:print('发生未知错误:',e)input()

使用方法:将需要处理的文件和python脚本放在同一个文件夹下,双击启动python脚本就可以了,处理之后会自动生成【result】开头的文件。

【python】自动统计考勤数据相关推荐

  1. 【Excel VBA】逐个读取Excel文件并将内容复制到汇总表中——每月自动汇总考勤数据实例

    纲举目张 说明 关键技术点:Workbooks.Open 代码code 运行效果图 使用说明 说明 上一讲[Excel VBA]利用数组.集合.循环等检查各单位报送情况--每月自动汇总考勤数据实例已经 ...

  2. 【Excel VBA】遍历获取文件夹下所有文件——每月自动汇总考勤数据实例

    纲举目张 说明 关键技术点:Dir函数 代码code 运行效果图 使用说明 说明 本次所讲的遍历获取某文件夹下所有文件,其实是我的<每月自动汇总考勤数据>案例中的其中一个知识点,近期我将会 ...

  3. python处理考勤数据_你真知道自己加了多少班吗?来来来,用Python分析一下考勤数据就知道了...

    前段时间给同事做Python爬虫技术分享,为了分享的效果以及听众的兴趣,写了一个爬取考勤数据的小爬虫.内容比较简单,以下做一个梳理: 一.问题分析 先梳理下查询考勤的流程: 登录公司内网的系统 切换到 ...

  4. 别再花时间统计考勤数据了,这个报表统计神器才是你最后出路

    老李我有个朋友是在国内某大型制造企业做人事的,每到月末,往往都是他最忙的时候,因为他起码要花上3-5天时间统计全公司的考勤信息,遇到忙的时候,常常是边跟我吃饭边工作. 一般来说,人事会先从考勤机(企业 ...

  5. 用 Python 自动生成 Excel 数据报表~

    大家好,我是小z 今天给大家来一波实战,使用Python自动化生成数据报表! 从一条条的数据中,创建出一张数据报表,得出你想要的东西,提高效率. 主要使用到pandas.xlwings以及matplo ...

  6. python自动获取邮件数据_Python 提取数据库(Postgresql)并邮件发送

    刚入门python,发现确实是一个不错的语言. 业务部门要求将将某一个数据库中的表,定期发送到相关部门人员邮箱. 其实整个业务需求很简单,实现起来也不难. 但是由于刚入门python,所以还是借鉴了不 ...

  7. 使用python自动生成病例数据并导出excel(附代码)

    因为实验需要处理大量的数据,便考虑进行自动生成,结果如下 代码如下 import time import random province=['河北','山西','辽宁','吉林','黑龙江','江苏' ...

  8. 用Python自动生成Excel数据报表!

    大家好,我是辰哥~ 点击下方名片关注和星标『Python研究者』!

  9. python自动获取邮件数据_Python 获取测试报告内容并发送邮件

    这里封装一个send_mail()方法,用于测试完成后读取测试报告内容并将测试结果发送邮件通知接收人 # coding: utf-8 import smtplib from email.mime.te ...

  10. 多条记录取最近日期的一条_Excel VBA:基于员工打卡记录的考勤数据统计

    微信公众号:金融数学 使用VBA做一个基于员工打卡记录的考勤数据分析工具; 1应用场景 某公司通过门禁系统记录了每位员工上下班打卡时间,现在需要对一段特定时间内员工出勤情况进行统计分析,包含加班时间( ...

最新文章

  1. Docker安装Nextcloud
  2. 爬虫,如何防止被ban之策略大集合
  3. 如何:在OpenText Workflow 6.5模型中保存和读取多行数据
  4. 3.5 Facade(外观)
  5. python库迁移到没有网的电脑_关于换机器后python库的迁移-偷懒做法
  6. Winfrom实用代码项目
  7. 基于windows使用fabric将gitlab的文件远程同步到服务器(本地)
  8. windows2003在打‘SP2’补丁时提示“拒绝访问”
  9. Vue打包并发布项目
  10. Interpreting Attributions and Interactions of Adversarial Attacks论文解读
  11. u-boot环境的擦除,默认设置,批写入
  12. 2019年泰迪杯技能赛A题心得
  13. x64技术之SSDT_Hook
  14. 前端vs图片:2 图片深度、图片分类等基本信息
  15. 北斗短报文通信实现源码
  16. 【云原生之k8s】k8s管理工具kubectl详解
  17. 硕博士学位论文标准制图技巧
  18. 解决Onenote不能同步
  19. 0CTF/TCTF 2021 Quals_Misc_singer
  20. HDLBITS笔记30:rule 90、rule 100以及Conway‘s game of life 16*16

热门文章

  1. AcWing1402. 星空之夜
  2. 操作抖音取名项目日赚 500 实战案例分析
  3. Python-实现(整蛊)消息批量发送
  4. android cpu型号采集,Android查看CPU型号设备信息等
  5. 如果你是互联网创业者,这个视频值1万元
  6. java中j是什么意思_i 1 j 是什么意思 i.j.k是什么意思
  7. 【Unity UGUI】屏幕坐标转换
  8. js 随机生成时间段
  9. pid双闭环matlab仿真,SPWM波控制单相逆变器双闭环PID调节器的Simulink建模与仿真
  10. matlab仿真放入直流电源,用Matlab/Simulink软件包建模电容滤波直流电源