python - 如何在数据框中计算每天和每周的加班时间?
问题描述
这是一个棘手的问题。我有一个看起来像这样的数据框:
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']]
解决方案
假设数据框仅包含一周的数据,请执行以下操作:
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)
推荐阅读
- facebook - Facebook 自定义标签
- python - python的多处理模块的join()当它的进程是一个守护进程时
- java - 将特定模式与范围匹配的正则表达式
- ios - 如何为 iOS 应用程序创建具有静态 IP 地址的主机 iPhone?
- asp.net-mvc - Bootstrap Dropdownlist 的宽度可以改变吗?
- javascript - Nightwatch 不能截图返回不是函数
- ios - 如何排序 [json] 在 swift 4.x 中使用 SwiftyJSON?
- reactjs - Electron 应用程序中的 Boostrap 错误
- angularjs - 带有嵌入式指令的 Angular Bootstrap 模态——无法获得价值?
- angular - 带有 API 数据的 Highcharts Angular