Это сложный вопрос. У меня есть фрейм данных, который выглядит примерно так:
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']))
(OT часы)
Проблема возникает, когда сотрудник работает более 40 часов в неделю и проработал более 8 часов в течение одного дня. Мне трудно комбинировать две формулы. Как видите, emp1
проработал 40 часов в первые 4 дня, поэтому все часы в row=4
следует считать сверхурочными.
Для каждой даты я хотел бы сложить все часы в Hours1
, для каждого сотрудника , а когда сумма> = 40, то все последующие часы считаются OT, а для этого сотрудника , часы не должны больше считаться регулярными. Такое ощущение, что должен быть цикл для каждой строки, для каждого сотрудника, который содержит это выражение, но все, что я пробовал, не сработало.
Ouput должно понравиться так:
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']]