读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'))

 

posted @ 2013-03-01 14:14  hhhyde  阅读(189)  评论(0编辑  收藏  举报