精华内容
下载资源
问答
  • python考勤统计

    千次阅读 2016-06-28 09:16:03
    本来想用python做一个考勤统计的软件,但是由于种种原因,暂停了这个想法,这是个软件的雏形,仅供大家参考 这个小玩意涉及了文件的读取,时间的比较,异常的处理,编码处理,可以用于python的初级练手,接...

    本来想用python做一个考勤统计的软件,但是由于种种原因,暂停了这个想法,这是个软件的雏形,仅供大家参考


    这个小玩意涉及了文件的读取,时间的比较,异常的处理,编码处理,可以用于python的初级练手,接下来,我就把代码贴出来供大家参考:


    #coding:utf8
    '''
    Created on 2016年6月27
    @author: hehe
    '''
    import xlrd
    import time
    import datetime
    import sys
    default_encoding = 'utf-8'
    if sys.getdefaultencoding() != default_encoding:
        reload(sys)
        sys.setdefaultencoding(default_encoding)
    
    
    
    # use for to read all tables
    
    
    def readtable():
        data = xlrd.open_workbook(r'C:\Users\8888\Desktop\haha.xlsx')
        table = data.sheet_by_index(0)
        return table 
    
    def get_num_nrow(table):
        return table.nrows
    
    def compute_time(time_begin , time_end):
        hour , minu  =  (int)(str(compare_time(time_begin, time_end))[0]),(int)(str(compare_time(time_begin, time_end))[2])*10+(int)(str(compare_time(time_begin, time_end))[3])
        return hour*60 + minu
    
    
    
    def compare_time(time_begin, time_end):
        date_1 = time.strptime(time_begin,"%H:%M")
        date_2 = time.strptime(time_end,"%H:%M")
              
        date1=datetime.datetime(date_1[0],date_1[1],date_1[2],date_1[3],date_1[4],date_1[5])
        date2=datetime.datetime(date_2[0],date_2[1],date_2[2],date_2[3],date_2[4],date_2[5])
        #print date2-date1
        return date2-date1
    
    def com_chidao(time_begin,time_s_beg):
        a=0
        b=0
        try:
            a=compute_time(time_begin,time_s_beg)
        except Exception:
            b=compute_time(time_s_beg,time_begin)
            return a,b
        
    def com_zaotui(time_begin,time_s_beg):
        c=0
        d=0
        try:
            c=compute_time(time_begin,time_s_beg)
        except Exception:
            d=compute_time(time_s_beg,time_begin)
            return c,d
    
    def judge_morning(time_list):
        time_begin = time_list[0]
        time_s_beg = u'8:30'
        time_end = time_list[1]
        time_s_end = u'12:00'
        if time_begin=='':
            print '早上没来'
        elif time_begin!='' and time_end=='':
            print '未签退'
        elif time_begin!='' and time_end!='':
            a,b=com_chidao(time_begin,time_s_beg)
            #c,d = com_zaotui(time_s_end,time_end)
            if a==0 and b!=0:
                print '迟到%d分'%b
            #if c==0 and d!=0:
               # print '早退%d分'%d
            else :
                print compare_time(time_begin,time_end)
            
                
    
    def judge_afternoon(time_list):
        time_begin = time_list[2]
        time_s_beg = u'14:30'
        time_end = time_list[3]
        time_s_end = u'18:00'
        if time_begin=='':
            print '下午没来'
        elif time_begin!='' and time_end=='':
            print '未签退'
        elif time_begin!='' and time_end!='':
            a,b=com_chidao(time_begin,time_s_beg)
            #c,d = com_zaotui(time_s_end,time_end)
            if a==0 and b!=0:
                print '迟到%d分'%b
            #if c==0 and d!=0:
               # print '早退%d分'%d
            else :
                print compare_time(time_begin,time_end)
    
    
    def judge_neight(time_list):
        time_begin = time_list[4]
        time_s_beg = u'19:30'
        time_end = time_list[5]
        time_s_end = u'22:00'
        if time_begin=='':
            print '晚上没来'
        elif time_begin!='' and time_end=='':
            print '未签退'
        elif time_begin!='' and time_end!='':
            a,b=com_chidao(time_begin,time_s_beg)
            #c,d = com_zaotui(time_s_end,time_end)
            if a==0 and b!=0:
                print '迟到%d分'%b
            #if c==0 and d!=0:
               # print '早退%d分'%d
            else :
                print compare_time(time_begin,time_end)
        
    
    
    if __name__ == '__main__':
        chidao = 0
        kuang = 0
        kuang_day = 0
        val_time = 0
        all_time = 0
        data = []
        
        table = readtable()
        print 'done'
        for i in range(get_num_nrow(table) ):
            value = table.row_values(i)
            if value[0][3]=='日':
                continue
            
            
            time_1_be , time_1_end , time_2_be ,time_2_end , time_3_be , time_3_end =value[1] ,value[3] ,value[6] ,value[8], value[10] ,value[12]
            #print time_1_be , time_1_end , time_2_be ,time_2_end , time_3_be , time_3_end
            time_list = [time_1_be , time_1_end , time_2_be ,time_2_end , time_3_be , time_3_end]
            
            if time_list[0]=='旷工':
                print '旷工'
                kuang_day+=1
                kuang+=3 
                continue
            
            #print time_list[0]
            #judje mornaing
            judge_morning(time_list)
            #judje afternoon
            judge_afternoon(time_list)
            #judge neight
            judge_neight(time_list)
              
    

    展开全文
  • 统计考勤python程序

    2020-10-12 09:51:48
    考勤机上用u盘拷出考勤数据,截取某一月的,用程序处理,得到每位员工的考勤记录excel表,可用于单位,公司等应用场景
  • python连接中控考勤机。 下载并分析数据,把结果邮件给人事。SDK包建议用32位的,在win7 64位系统上用64位开发包不行,用32可以。python还要pywin32 注意版本,我这用的 32位的python 2.7 然后下的这个pywin32...

    用python连接中控考勤机。 下载并分析数据,把结果邮件给人事。

    SDK包建议用32位的,在win7 64位系统上用64位开发包不行,用32可以。

    python还要pywin32 注意版本,我这用的 32位的python 2.7 然后下的这个pywin32

    excel 用了 xlsxwriter 这个功能不错#!/usr/bin/env python

    #_*_ coding:gbk _*_

    import win32com.client

    import datetime

    import xlsxwriter

    import sys

    import smtplib

    from email.mime.multipart import MIMEMultipart

    from email.mime.text import MIMEText

    from email.mime.p_w_picpath import MIMEImage

    non = {21:"niu.niu", } #非研发人员

    no_checkin = [1,34,35,36,23,40] #不计考勤人员

    def send_mail(filename=[], picname=[], content_txt='', content_html=''):

    smtpserver = 'smtp.163.com'

    username = 'test@163.com'

    password = '123123'

    msg = MIMEMultipart()

    msg['Subject'] = 'Check_In %s' % today.strftime("%Y-%m-%d")

    msg['From'] = "test@163.com"

    msg['To'] = "hr@163.com"

    # attchment

    if len(filename) > 0:

    for i in filename:

    att = MIMEText(open(i, 'rb').read(), 'base64', 'gb2312')

    att["Content-Type"] = 'application/octet-stream'

    att["Content-Disposition"] = 'p_w_upload; filename="%s"' % i.split('\\')[-1]

    msg.attach(att)

    # attchment picture

    if len(picname) > 0 and content_html != '':

    for i in range(0,len(picname)):

    #content_html = 'Some HTML text and an p_w_picpath.

    good!' % i

    msg_content_html = MIMEText(content_html,'html','gb2312')

    msg.attach(msg_content_html)

    with open(picname[i], 'rb') as f:

    msgImage = MIMEImage(f.read())

    msgImage.add_header('Content-ID', '' % (i + 1))

    msg.attach(msgImage)

    # content text

    if content_txt != '':

    msg_content_txt = MIMEText(content_txt,_subtype='plain',_charset='gb2312')

    msg.attach(msg_content_txt)

    # content html

    if content_html != '' and len(picname) == 0:

    msg_content_html = MIMEText(content_html,_subtype='html',_charset='gb2312')

    msg.attach(msg_content_html)

    smtp = smtplib.SMTP()

    smtp.connect(smtpserver)

    smtp.starttls()

    smtp.login(username, password)

    smtp.sendmail(msg['From'], msg['To'], msg.as_string())

    smtp.quit()

    zk = win32com.client.Dispatch('zkemkeeper.ZKEM.1')

    if not zk.Connect_Net('192.168.1.31', 4370):

    print "Connect Error"

    sys.exit(1)

    if len(sys.argv) == 2: #如果以 ./script 2015-11-22 这样的方式运行,可以指定别的星期

    today = datetime.datetime.strptime( sys.argv[1] + " 11:22:33", '%Y-%m-%d %H:%M:%S')

    else:

    today = datetime.datetime.now()

    zk.SetDeviceTime(1) #set pc time

    if datetime.datetime.now().weekday() != 0:

    zk.Disconnect()

    sys.exit(1)

    zk.ReadAllUserID(1)

    uid = {}

    while 1:

    exists, idNum, username, other, privilege, enable = zk.GetAllUserInfo(1)

    if not exists:

    break

    else:

    if enable:

    uid[idNum] = username.split(u'\x00')[0].encode('gbk')

    checkin,uid_name = {}, []

    if len(sys.argv) == 1:

    log = open(today.strftime("D:\\CheckIn\\bak\\%Y-%m-%d.txt"), "w")

    if zk.ReadGeneralLogData(1): #read All checkin data

    while 1:

    exists, machNum, idNum, emachNum, verifyMode, outMode, year, month, day, hour, minute = zk.GetGeneralLogData(1) #2

    if year <= today.year:

    if 0 < (datetime.date(today.year,today.month,today.day) - datetime.date(year,month,day)).days < 8:

    if len(sys.argv) == 1:

    log.write("%s-%s-%s %02d:%02d %s %s\n" % (year,month,day,hour,minute,uid.get(idNum,"ERROR"),idNum))

    if idNum not in uid:

    continue

    if day not in checkin:

    checkin[day] = {}

    try:

    checkin[day][idNum].append(hour * 60 + minute)

    except:

    checkin[day][idNum] = [hour * 60 + minute]

    else:

    break

    if len(sys.argv) == 1:

    log.close()

    zk.Disconnect()

    if len(sys.argv) == 1: #自动运行保存指定位置

    workbook = xlsxwriter.Workbook(today.strftime("D:\\CheckIn\\xlsx\\%Y-%m-%d.xlsx"))

    else:

    workbook = xlsxwriter.Workbook(today.strftime("%Y-%m-%d.xlsx"))

    worksheet = workbook.add_worksheet("WeekAll")

    worksheet.set_column(0, 0, 10)

    format1 = workbook.add_format({'bg_color': '#FFC7CE'})

    sheet = {}

    uid_name = sorted(uid.keys())

    for i in range(8,0,-1):

    dayNum = (today - datetime.timedelta(days=i)).strftime("%Y-%m-%d")

    n = 0

    if i < 8:

    worksheet.write(8-i, n, dayNum)

    sheet[8-i] = workbook.add_worksheet(dayNum)

    worksheet.write_url(row=8-i,col=0,url="internal:'%s'!A1" % dayNum, string=dayNum, tip=dayNum)

    sheet[8-i].write(0,0,"Name")

    sheet[8-i].write(0,1,"AM")

    sheet[8-i].write(0,2,"PM")

    sheet[8-i].write(0,3,"Time")

    dayNum = int(dayNum.split('-')[-1])

    for col in uid_name:

    work_time = 9

    if col in no_checkin: #不需要统计考勤

    continue

    n += 1

    if i == 8:

    worksheet.write(8-i, n, uid[col].decode('gbk'))

    continue

    sheet[8-i].write(n, 0, uid[col].decode('gbk'))

    if dayNum not in checkin or col not in checkin[dayNum]:

    continue

    if len(checkin[dayNum][col]) < 2 and i > 2:

    sheet[8-i].write(n, 3, 0, format1)

    worksheet.write(8-i, n, 0, format1)

    am = checkin[dayNum][col][0]

    pm = 0

    else:

    min_time = am = min(checkin[dayNum][col])

    max_time = pm = max(checkin[dayNum][col])

    if min_time < 510: #最早从8:30 计考勤

    min_time = 510

    elif col not in non and 570 < min_time <= 600: #研发9:30后,10:00以前,算两倍。

    if (min_time-570) * 2 <= 30:

    work_time += 0.5

    else:

    work_time += 1

    dayTime = max_time - min_time #当天工作时间

    if dayTime%60 >= 45:

    dayTime = dayTime//60 + 1

    elif 15 <= dayTime%60 < 45:

    dayTime = dayTime//60 + 0.5

    else:

    dayTime = dayTime//60

    if (col in non and min_time > 540) and i > 2: #非研发过 9 点算迟到

    sheet[8-i].write(n, 3, dayTime, format1)

    worksheet.write(8-i, n, dayTime, format1)

    elif (col not in non and min_time > 600) and i > 2: #研发过 10 点算迟到

    sheet[8-i].write(n, 3, dayTime, format1)

    worksheet.write(8-i, n, dayTime, format1)

    elif dayTime < work_time and i > 2: #时间不够未到工作时间

    sheet[8-i].write(n, 3, dayTime, format1)

    worksheet.write(8-i, n, dayTime, format1)

    else:

    worksheet.write(8-i, n, dayTime)

    sheet[8-i].write(n, 3, dayTime)

    #添加批注

    if pm:

    worksheet.write_comment(8-i, n, 'AM %02d:%02d\nPM %02d:%02d' % (am//60, am%60,

    pm//60, pm%60))

    sheet[8-i].write(n, 1, '%02d:%02d' % (am//60, am%60))

    sheet[8-i].write(n, 2, '%02d:%02d' % (pm//60, pm%60))

    else:

    if am < 720:

    worksheet.write_comment(8-i, n, 'AM %02d:%02d' % (am//60, am%60))

    sheet[8-i].write(n, 1, '%02d:%02d' % (am//60, am%60))

    else:

    worksheet.write_comment(8-i, n, 'PM %02d:%02d' % (am//60, am%60))

    sheet[8-i].write(n, 2, '%02d:%02d' % (am//60, am%60))

    workbook.close()

    if len(sys.argv) == 1:

    send_mail(filename=[today.strftime("D:\\CheckIn\\xlsx\\%Y-%m-%d.xlsx")], content_txt='Check_In %s' % today.strftime("%Y-%m-%d"))

    展开全文
  • 支持自定义格式输出,生成每个人的考勤统计 基于pandas和xlwings对表格进行读写 import pandas as pd import sys import os import numpy as np import xlwings as xw import time import datetime import glob sys...
    • 解决钉钉导出考勤表统计(加班时长、补贴)
    • 支持自定义格式输出,生成每个人的考勤统计
    • 基于pandas和xlwings对表格进行读写
    import pandas as pd
    import sys
    import os
    import numpy as np
    import xlwings as xw
    import time
    import datetime
    import glob
    sys.path.append(os.path.dirname(os.path.abspath(__file__)))
    
    class CheckIn:
        def __init__(self):
            pass
    
        def check_table(self, url):
            df = pd.read_excel(url, header=None, index_col=None)
            df = df[2:]
            df = df[[0, 1, 5, 6, 7, 8, 9]]
            df = df.drop(3, axis=0)
            df.columns = df.iloc[0].values
            df = df.drop(2, axis=0)
            # 只处理含‘正常’班和休息的班次
            df = df[df['上班1打卡结果'].isin(['正常']) | df['班次'].isin(['休息'])]
            # 必须包含上下班打卡
            df = df[~df['上班1打卡时间'].isin([np.NaN]) & ~df['下班1打卡时间'].isin([np.NaN])]
            df['累计加班'] = 0
            df['加班次数'] = 0
            df['餐补标准'] = 25
            df['报销金额'] = 0
            for _, row in df.iterrows():
                # 计算上下班时间
                row['上班1打卡时间'] = str(row['上班1打卡时间'])[0: 5]
                row['下班1打卡时间'] = str(row['下班1打卡时间'])[0: 5]
                start_time = row['上班1打卡时间']
                over_time = row['下班1打卡时间']
                add_min = 0
                if '次日' in row['下班1打卡时间']:  # 最晚有效下班时间为24:00
                    over_time = '23:59'
                    add_min = 60
                # print('start_time', str(start_time))
                start_time = datetime.datetime.strptime(start_time, "%H:%M")
                over_time = datetime.datetime.strptime(over_time, "%H:%M")
                work_time = max(round(((over_time - start_time).seconds + 1 + add_min) / 3600), 0)
                #  餐补统计
                if ('正常' in row['上班1打卡结果']) and (row['下班1打卡时间'] >= '19:00'):
                    df.loc[row.name, '加班次数'] = 1
                elif '休息' in row['班次']:
                    if work_time >= 4:
                        df.loc[row.name, '加班次数'] = 1
                    if work_time >= 7:
                        df.loc[row.name, '加班次数'] = 2
                df.loc[row.name, '报销金额'] = df.loc[row.name, '加班次数'] * df.loc[row.name, '餐补标准']
                #  加班统计
                work_plus_time = 0
                if '正常' in row['上班1打卡结果']:
                    if start_time.hour >= 7:  # 有效打卡早7点以后
                        if start_time.hour <= 9:  # 九点后累计上班时长
                            start_time = datetime.datetime.strptime('09:00', "%H:%M")
                        work_plus_time = max(round(((over_time - start_time).seconds + 1 + add_min) / 3600 - 9.5),
                                             0)  # 超过9.5计算加班时长,半小时一个粒度
                elif '休息' in row['班次']:
                    if work_time >= 4:
                        work_plus_time = work_time
                df.loc[row.name, '累计加班'] = work_plus_time
    
            word_plus = url.replace('base', 'new').replace('考勤表', '加班餐补-加班时长明细表')
            df.to_excel(word_plus, index=False)
            df['加班日期'] = df['日期'].map(lambda x: x.split(" ")[0] + ' ') + df['下班1打卡时间'].map(str)
            df.loc[df['班次'] == '休息', '加班日期'] = df['日期'].map(str) + df['上班1打卡时间'].map(str)
            df_output = df[['姓名', '加班日期', '加班次数', '餐补标准', '报销金额', '上班1打卡结果', '班次', '累计加班']]
            return df_output[['姓名', '加班日期', '加班次数', '餐补标准', '报销金额', '累计加班', '班次']]
    
        def money_table(self, url, data, output_url):
            data = data[data['加班次数'] > 0 | data['班次'].isin(['休息'])]
            data = data.drop(['班次'], axis=1)
            name_list = data['姓名'].unique()
            wb = xw.Book(url)
            sht_sheet1 = wb.sheets['Sheet1']  # 要复制的sheets
            for i, v in enumerate(name_list):
                sht_sheet1.api.Copy(Before=sht_sheet1.api)
                sht = wb.sheets['Sheet1 (2)']
                sht.api.Name = v
                struct_time = time.localtime(time.time())  # 得到结构化时间格式
                now_time = time.strftime("%Y/%m/%d", struct_time)
                sht.range('H4').value = now_time
                sht.range('B4').value = output_url.split('/')[-1].split('\\')[-1].split('20')[0]
                item = data[data['姓名'] == v]
                new_data_rows = item.values.shape[0]
                item.insert(0, '序号', [i+1 for i in range(new_data_rows)])
                start_row = 7
                # last_row = sht.range('A7').expand().last_cell.row
                last_row = 38
                work_rows = last_row - start_row
                sub_rows = abs(new_data_rows - work_rows)
                # print(f'last{last_row},word{work_rows}')
                if new_data_rows > work_rows:
                    for _ in range(sub_rows):
                        sht.api.rows(start_row + 1).insert
                elif new_data_rows < work_rows:
                    for _ in range(sub_rows):
                        sht.api.rows(start_row + 1).delete
                # print(f'last{sht.range("A7").expand().last_cell.row},new{new_data_rows},word{work_rows}')
                sht.range('A7').value = item.values
            wb.save(output_url)
            wb.close()
    
        def total(self, df, output_url):
            total_df = df.groupby(by='姓名').sum()[['加班次数', '报销金额', '累计加班']]
            total_df = total_df.sort_values(by='加班次数', ascending=False)
            total_df['备注'] = ''
            total_df = total_df.reset_index()
            total_df = total_df.append([{
                '姓名': '合计', '加班次数': total_df['加班次数'].sum(), '报销金额': total_df['报销金额'].sum(),
                '累计加班': total_df['累计加班'].sum(), '备注':''
            }], ignore_index=True)
            total_df.to_excel(output_url, index=None)
    
    
    if __name__ == '__main__':
        t = time.time()
        year = '2019'
        month = '5'
        root = '../../data/check'
        standard_url = f'{root}/研发加班餐补201908_standard.xlsx'
        for _, m in enumerate(range(10, 11, 1)):
            month = m
            print(f'生成月份:{month}')
            for check_url in glob.glob(f"{root}/{year}-{month}/base/*.xlsx"):
                if '$' in check_url:
                    continue
                check_in = CheckIn()
                check_df = check_in.check_table(url=check_url)
                new_url = check_url.replace('base', 'new')
                total_output_url = new_url.replace('考勤表', '总计表')
                money_output_url = new_url.replace('考勤表', '加班餐补表')
                check_in.total(df=check_df, output_url=total_output_url)
                check_df = check_df.drop('累计加班', axis=1)
                check_in.money_table(url=standard_url, data=check_df, output_url=money_output_url)
        print(time.time()-t)
    
    # print(df_output)
    # df_output.to_excel(url.replace('.xlsx', '_清洗.xlsx'), index=None)
    
    

    文件目录

    在这里插入图片描述

    钉钉导出表

    在这里插入图片描述

    生成个人统计表

    在这里插入图片描述

    依照标准格式表生成每人一张表

    在这里插入图片描述

    生成汇总统计表

    在这里插入图片描述

    展开全文
  • python考勤统计

    2020-09-03 19:50:05
    ![图片说明](https://img-ask.csdn.net/upload/202009/03/1599133606_366647.jpg)![图片说明](https://img-ask.csdn.net/upload/202009/03/1599133624_616872.jpg) 把第二个图汇成第一个图
  • 钉钉打卡工时统计,表1为原始打卡记录,怎么用Python或者VBA生成表2工时格式。 早上上班时间为7:00,下班时间为11:30,下午上班时间为13:30下班时间为17:30,如果有加班加班时间为18:00-20:30。 中午休息1.5...
  • 如果没有钉钉这种打卡软件可以帮你统计考勤数据,而且考勤机导出的数据只有员工打卡时间时,可以利用python编写一个自动统计的脚本,加快办公效率 实现的几个功能: 1、按月统计出勤,早退,迟到等常见指标 2...

    如果没有钉钉这种打卡软件可以帮你统计考勤数据,而且考勤机导出的数据只有员工打卡时间时,可以利用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.hour
        if 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).days
      weekends, 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 +=.5
        if start_day<=7 and end_day>7: #上面是算周末,现在是只算周日
          weekends +=1
      return 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.year
        data['Month'] = data['Tiempo'].dt.month
        data['Day'] = data['Tiempo'].dt.day
        data['Time'] = data['Tiempo'].dt.time
        
        data['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.5
        df_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_file
        
        with 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】开头的文件。

     

    展开全文
  • 注:此资料亲身使用,真实可靠,如果运行方面有问题,可以私聊 ...wb = load_workbook('10月考勤统计.xlsx') ws = wb.active dict = {} for i in ws.iter_rows(min_row=2,values_only=True): name = i[1] num
  • 加班考勤统计

    千次阅读 2014-02-09 19:07:52
    用web.py做了个统计每月加班情况的程序,免得每次统计考勤记录的时候找秘书要。 原文见:http://giftbrandmaker.com/myblog/?p=336
  • 使用Python爬取考勤信息

    千次阅读 2018-12-29 11:50:40
    最近公司的加班调休审批制度有一些调整,由于公司网站上没有清楚的标明各自有多少天可以调休,所以为了清楚的知道自己还有多少天可以调休,就想着使用爬虫爬一下考勤信息,把它放在一个Excel表中以方便查阅。...
  • Python人脸识别考勤打卡系统

    千次阅读 多人点赞 2021-07-14 15:42:40
    Python人脸识别考勤打卡系统 如需安装运行环境或远程调试,可加QQ905733049,或QQ2945218359由专业技术人员远程协助! 运行结果如下: 主要代码: import random import cv2 import numpy import datetime ...
  • 在做公司的临时工考勤工资表时,考勤机导出的excel为卡式报表,看很直观,但处理起来麻烦。所以做了一个odoo模块用于将卡式报表处理成更常规的适合财务统计的普通报表。语言Python,用到的模块为xlrd和xlwt。 2.先看...
  • python opencv人脸识别考勤系统 如需安装运行环境或远程调试,可加QQ905733049,或QQ2945218359由专业技术人员远程协助! 运行结果如下: 代码如下: import wx import wx.grid from time import localtime,...
  • python连接中控考勤机分析数据

    千次阅读 2017-11-12 14:44:00
    python连接中控考勤机。 下载并分析数据,把结果邮件给人事。 中控SDK包:x32地址x64地址 SDK包建议用32位的,在win7 64位系统上用64位开发包不行,用32可以。 python还要pywin32 注意版本,我这用的 32位的...
  • 利用Python实现对考勤打卡数据简单数据处理的总结一、背景交代二、说明三、 8种方法1. 查看文件是否存在2. 导入excel文件,并把数据保存为dataframe格式3. 计算程序运行时间4. 对格式为“年-月-日 时:分:秒”的时间...
  • 一个python实现自动打卡的脚本代码
  • 注:此资料亲身使用,真实可靠,如果运行方面有问题,可以私聊 ...wb = load_workbook('数据筛选/10月考勤统计.xlsx') ws = wb.active # for i in ws['A']: # print(i.value) li = [] for i in ws[1]: l
  • 考勤管理代码:python基础练手用的

    千次阅读 2019-08-06 15:35:04
    1.统计考勤表中一共有多少个打卡用户 2.每个用户打卡多少次 3.每个用户应该打卡多少次 4.每个用户正常打卡多少次 5.主程序,整个四个需求 #encoding:utf-8 import pandas as pd import config def need_01()...
  • 学习笔记:python人脸识别4-考勤系统

    千次阅读 热门讨论 2019-02-17 14:27:16
    学习人脸识别,一个应用是考勤系统,学习软件,必须站在前人的肩膀上,从网上找到一个可以参考的模型,是个学生的作业,算很不错了,点个赞,就下载,配置环境测试了一下,可用 作者网址:...
  • 本项目使用Python3.8编写,Qt Designer(QT5)设计主界面,PyQt5库编写控件的功能,使用开源FaceNet人脸识别算法进行人脸识别,使用眨眼检测来实现活体识别,使用OpenCV3实现实时人脸识别。同时,将班级学生信息,各...
  • Python excel xlwings+QT 考勤表开发1. 概述2. QT界面搭建2.1搭建界面3. 搭建软件架构3. 读取输入文件3.1链接文件3.2读取表格3.3解析为树状结构4.输出文件4.1 拆分文件5.合并文件5.1 合并文件参考文章 1. 概述 这是...
  • python 操作excel用来做考勤报表。

    千次阅读 2013-03-19 13:47:50
    这两天帮公司写的一个考勤表报的脚本。 #!c://python25//env python #-*-coding:utf8-*- #-*-coding:GB2312-*- #-*-coding:cp936-*- #-*-coding:WINDOWS-936-*- #from win32...
  • 钉钉API考勤打卡记录获取并存入数据库(python

    万次阅读 热门讨论 2019-07-25 13:00:57
    钉钉有个开发平台,通过API可以开发自己企业内部应用,钉钉开发文档顺序写的有点乱,花了挺长时间才看懂,我写了一个python脚本来获取考勤记录,当然能做的不止这些,可以删除公司成员,修改部门,瞎发通知等等。...
  • 使用易学的Python和它强大的三方库开发一个简易考勤系统:1.开发背景2.实现过程- 数据读取- 数据切片并对比匹配- 图形化开发3.运行效果- 界面- 选择路径- 读取数据- 最终效果4. 注意事项 1.开发背景 在今年疫情期间...
  • 考勤表格 考勤表格 考勤表格 考勤表格 考勤表格 考勤表格 考勤表格 考勤表格
  • 题目如下: ========================================================================== 知识点: ※ end() ls =[] for i in range(1,11): #打开10个文件 fo = open(str(i)+"csv","r",encoding = "utf-8") ...
  • 在上一篇博客中,我们完成了考勤系统的基本功能。现在,让我们继续开发请假系统。 十一 构建事件种类 还记得我们之前建立的考勤事件么?在当前的设计中,考勤事件有两个字段:事件代码和事件名称,现在我们决定给...
  • python 学习期末成绩统计分析并生成成绩表 上次的准考证妻子学校老师和领导的一致好评,然后新的任务又来的。期末考试成绩分析 场景分析 新的高考改革后,每个人的考试科目都不完全一样,这就给期末分析成绩的老师...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 606
精华内容 242
关键字:

python考勤统计

python 订阅