我有一个包含员工工资信息(df2)的数据集。它具有日期,职务,轮班开始时间,工作时间。
目标是创建一个数据集(df),以显示在给定的小时内有多少员工在工作。
我面临的问题是在列中设置值对原始数据集(df)没有任何影响。
data1 = [['2/1/2019','Cashier',0,0,0,0,0,0,0], ['2/2/2019','Cashier',0,0,0,0,0,0,0], ['2/1/2019','Server',0,0,0,0,0,0,0]]
cols1 = ['Date', 'Job'] + list(pd.date_range(pd.to_datetime('2/1/2019 15:00'), periods=7, freq='H'))
df=pd.DataFrame(data1, columns=cols1)
data2=[['2/1/2019', 'Cashier', pd.to_datetime('2/1/2019 16:00'), 5.2]]
cols2=['Date', 'Job', 'Start', 'Hours']
df2=pd.DataFrame(data2, columns=cols2)
def count_shifts(x):
start_time=x['Start']
worked_in_minutes =round(x['Hours']) * 60 + (x['Hours'] - round(x['Hours']))
worked_range_index = pd.date_range(start_time, periods=worked_in_minutes, freq='T')
worked_series = pd.Series(1/60, index=worked_range_index)
worked_series=worked_series.resample('H', label='left').sum()
df.loc[:,list(worked_series.index)] \
[(df['Job']==x['Job']) & (df['Date']==x['Date'])] = worked_series.values
df2.apply(count_shifts, axis=1)
我希望df列对应于15:00、16:00、17:00、18:00、19:00的小时数等于1,而20:00的小时数等于.2,但实际结果是它们仍然是0
答案 0 :(得分:0)
有两个问题:
第一
worked_in_minutes =round(x['Hours']) * 60 + (x['Hours'] - round(x['Hours']))
并未达到您的期望。
df2
中第一行等于300.2,而不是您期望的312。分隔小时/分钟没有意义,因为它已经是十进制。 worked_in_minutes = round(x['Hours'] * 60
就足够了。
第二,您的分配语句首先获取一个子集,然后进行设置。这可能会有意外的行为。
将其更改为df.loc[(df['Job']==x['Job']) & (df['Date']==x['Date']),list(worked_series.index)] = worked_series.values