读xls处理工时
1 #coding:utf-8 2 ''' 3 Created on 2012-12-27 4 5 @author: hhhyde 6 ''' 7 def exec123(filepath, place, name): 8 ''' 9 filepath:待处理xls绝对路径 10 palce:办公场地 11 name:待处理对象的姓名 12 ''' 13 from pyExcelerator import parse_xls 14 #打开xls 15 a=parse_xls(filepath) 16 from datetime import timedelta 17 worktime=timedelta(hours = int(0)) 18 stand_worktime=9.5 19 for temp_sheet in a: 20 if place==temp_sheet[0]: 21 palce_sheet=temp_sheet 22 palce_data=palce_sheet[1] 23 pps={}#{日期:记录} 24 #整理有效数据,取出日期和打卡记录 25 for k, v in palce_data.items(): 26 if name==v: 27 #取出每条打卡记录的日期 28 sign_date=palce_data[(k[0], k[1]+2)] 29 #取出每条打卡记录 30 sign_sign=palce_data[(k[0], k[1]+3)] 31 #过滤掉无效数据(入周末加班不计入工时) 32 if NoWeekend(sign_date): 33 pps[sign_date]=sign_sign 34 #处理数据 35 for curdate, sign in pps.items(): 36 print('%s\n%s'%(curdate, sign)) 37 #sign_points=[8:01,8:04,9:22,18:22]类似这样的记录 38 sign_points=sign.split(' ') 39 #max='18:22',取最后一条记录 40 max=sign_points[len(sign_points)-1] 41 #max=(18,22),小时和分钟分离 42 max=max.split(':') 43 #min='8:01' 44 min=sign_points[0] 45 #min=(8,01) 46 min=min.split(':') 47 print('工时%s'%Exec_worktime(min, max)) 48 worktime+=Exec_worktime(min, max) 49 print('-----------------') 50 #根据打卡记录条数来决定工作天数 51 onworkdays=len(pps) 52 #正常工时(工时最低标准,必须达到) 53 onworkdays=timedelta(hours = onworkdays*stand_worktime) 54 #判断是否欠工时 55 if onworkdays>worktime: 56 return '欠工时--->%s'%(onworkdays-worktime) 57 else: 58 return '剩余工时--->%s'%(worktime-onworkdays) 59 60 def Exec_worktime(min = None, max = None): 61 ''' 62 min:第一次打卡记录 63 max:最后一次打卡记录 64 ''' 65 from datetime import timedelta 66 max=timedelta(hours = int(max[0]), minutes = int(max[1]))#最后打卡时间 67 min=timedelta(hours = int(min[0]), minutes = int(min[1]))#第一次打卡时间 68 eight=timedelta(hours = 8)#上班时间 69 off=timedelta(hours = int(18))#18点 70 nine=timedelta(hours = int(9))#9点 71 workout=timedelta(hours = int(17), minutes = 30)#17:30 72 worktime=timedelta(hours = int(0))#默认 73 minus_wt=timedelta(hours = int(0))#负工时,默认 74 positive_wt=timedelta(hours = 9, minutes = 30)#正工时,默认 75 76 #第一次打卡在8:00后超出时间计入负工时,9点后不计,使用忘打卡 77 if min>eight and min<nine: 78 minus_wt=min-eight 79 #第一次打卡在8:00前,0工时 80 else: 81 pass 82 #最后打卡时间在18点后剩余时间计入正工时 83 if max>off: 84 positive_wt+=max-off 85 #否则不计入正工时 86 else: 87 pass 88 # print(minus_wt) 89 # print(positive_wt) 90 worktime=positive_wt-minus_wt 91 return worktime 92 93 def NoWeekend(date): 94 ''' 95 date:传入时间,格式类似'2013-02-22' 96 ''' 97 import datetime 98 a=date.split('-') 99 weekday=datetime.date(int(a[0]), int(a[1]), int(a[2])) 100 # if weekday.isoweekday()<=5: 101 # return True 102 # else: 103 # return False 104 # 105 return True if weekday.isoweekday()<=5 else False 106 107 if __name__=='__main__': 108 # print(NoWeekend('2013-03-02'))