Как рассчитать ежедневные и еженедельные сверхурочные часы во фрейме данных? - PullRequest
0 голосов
/ 08 сентября 2018

Это сложный вопрос. У меня есть фрейм данных, который выглядит примерно так:

    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']]

1 Ответ

0 голосов
/ 08 сентября 2018

Предполагая, что фрейм данных содержит данные только за одну неделю, выполните:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...