首页 > 解决方案 > 如何在数据框中计算每天和每周的加班时间?

问题描述

这是一个棘手的问题。我有一个看起来像这样的数据框:

    Employee    Date    Hours1  Reg      OT 
0    emp1   08/12/2018  10.00   8.00    2.00    
1    emp1   08/13/2018  10.00   8.00    2.00
2    emp1   08/14/2018  10.00   8.00    2.00    
3    emp1   08/15/2018  10.00   8.00    2.00    
4    emp1   08/17/2018  10.00   8.00    2.00    
5    emp2   08/12/2018  7.00    7.00    0.00    
6    emp2   08/13/2018  9.00    8.00    1.00
7    emp2   08/15/2018  10.00   8.00    2.00
8    emp2   08/17/2018  10.00   8.00    2.00
9    emp2   08/18/2018  8.00    8.00    0.00

我想做的是计算加州员工的加班时间。加利福尼亚州法律规定,一天内超过 8 小时和/或一周内超过 40 小时的任何时间都被视为超时。

Hours1= 当天的总工作时间。

Reg = np.where((df['Hours1']) < 8, df['Hours1'], (df['OT']))(正常时间)

OT = np.where((df['Hours1']) > 8, (df['Hours1']) - 8, (df['OT']))(加班时间)

当员工一周工作超过 40 小时并且一天工作超过 8 小时时,就会出现此问题。我很难将这两个公式结合起来。如您所见,emp1前 4 天工作了 40 小时,因此所有时间row=4都应视为加班。

对于每个日期,我想将每个员工Hours1的所有小时数相加,当金额 >=40 时,所有后续小时数都被视为 OT,对于该员工,不再应将任何时间视为常规时间。感觉每一行,每个员工都应该有一个包含这个表达式的循环,但我尝试过的一切都没有奏效。

输出应该是这样的:

    Employee    Date    Hours1  Reg      OT 
0    emp1   08/12/2018  10.00   8.00    2.00    
1    emp1   08/13/2018  10.00   8.00    2.00
2    emp1   08/14/2018  10.00   8.00    2.00    
3    emp1   08/15/2018  10.00   8.00    2.00    
4    emp1   08/17/2018  10.00   0.00    10.00    
5    emp2   08/12/2018  7.00    7.00    0.00    
6    emp2   08/13/2018  9.00    8.00    1.00
7    emp2   08/15/2018  10.00   8.00    2.00
8    emp2   08/17/2018  10.00   8.00    2.00
9    emp2   08/18/2018  8.00    4.00    4.00

任何和所有的帮助表示赞赏。

对于未来的读者来说,等式的关键是cumsum. 最终代码如下所示(注意:我删除了注册时间):

df['Cum hours'] = df.groupby('Employee')['Hours1'].transform('cumsum')

df['Week OT'] = np.where(df['Cum hours'] - df['Hours1'] > 40, 
                      df['Hours1'], 
                      df['Cum hours'] - 40)

df['OT'] = np.where(df['Cum hours'] > 40, 
             df['Week OT'], 
             df['OT'])

df = df.loc[:, ['Employee', 'Date', 'Hours1', 'OT']]

标签: pythonpandasnumpy

解决方案


假设数据框仅包含一周的数据,请执行以下操作:

cumulative_hours = df.groupby('Employee')['Hours1'].cumsum()

ot_within_day = df.OT
ot_within_week = np.where(cumulative_hours - df.Hours1 > 40, 
                          df.Hours1, 
                          cumulative_hours - 40)

ot_CA = np.where(cumulative_hours > 40, 
                 ot_within_week, 
                 ot_within_day)

推荐阅读