Python DataFrame自定义GroupBy函数接收到错误数据
我有一个时间追踪工具的数据。在这些数据中,我试图按天对数据进行分组,并对暂停、开始和结束时间进行一些计算。因此,我将应用一个自定义组函数。但不知何故,在该函数中接收到的数据总是来自第1组的数据。它总是Python DataFrame自定义GroupBy函数接收到错误数据,python,pandas,dataframe,group-by,pandas-groupby,Python,Pandas,Dataframe,Group By,Pandas Groupby,我有一个时间追踪工具的数据。在这些数据中,我试图按天对数据进行分组,并对暂停、开始和结束时间进行一些计算。因此,我将应用一个自定义组函数。但不知何故,在该函数中接收到的数据总是来自第1组的数据。它总是2019-11-04,永远不会2019-11-05。知道我做错了什么吗 输入数据: date_at minutes user_id start end 0 2019-11-04 60 112826 2019-11-04 08:30:00 2019-11-04 09:30:00
2019-11-04
,永远不会2019-11-05
。知道我做错了什么吗
输入数据:
date_at minutes user_id start end
0 2019-11-04 60 112826 2019-11-04 08:30:00 2019-11-04 09:30:00
1 2019-11-04 60 112826 2019-11-04 09:30:00 2019-11-04 10:30:00
2 2019-11-04 30 112826 2019-11-04 10:30:00 2019-11-04 11:00:00
3 2019-11-04 30 112826 2019-11-04 11:00:00 2019-11-04 11:30:00
4 2019-11-04 30 112826 2019-11-04 11:30:00 2019-11-04 12:00:00
5 2019-11-04 210 112826 2019-11-04 12:30:00 2019-11-04 16:00:00
6 2019-11-04 60 112826 2019-11-04 16:00:00 2019-11-04 17:00:00
7 2019-11-04 60 112826 2019-11-04 17:00:00 2019-11-04 18:00:00
8 2019-11-05 45 112826 2019-11-05 09:30:00 2019-11-05 10:15:00
9 2019-11-05 45 112826 2019-11-05 10:15:00 2019-11-05 11:00:00
10 2019-11-05 90 112826 2019-11-05 11:00:00 2019-11-05 12:30:00
11 2019-11-05 60 112826 2019-11-05 13:00:00 2019-11-05 14:00:00
12 2019-11-05 30 112826 2019-11-05 14:00:00 2019-11-05 14:30:00
13 2019-11-05 30 112826 2019-11-05 14:30:00 2019-11-05 15:00:00
14 2019-11-05 60 112826 2019-11-05 15:00:00 2019-11-05 16:00:00
15 2019-11-05 150 112826 2019-11-05 16:00:00 2019-11-05 18:30:00
16 2019-11-05 30 112826 2019-11-05 18:30:00 2019-11-05 19:00:00
我的代码:
def custom_groupby(data:pd.DataFrame):
#print (data)
data.sort_values(by=['start'], inplace=True, ascending=True)
times = list(zip(data.start, data.end))
erroneous = False
minutes_working = 0
minutes_paused = 0
l = len(times)
day_begin = times[0][0]
day_end = times[l-1][1]
for i, (start1, end1) in enumerate(times):
minutes_working += (end1 - start1).total_seconds() / 60
# is there a next entry?
if i + 1 == l:
break
# get next entry
start2, end2 = times[i+1]
if start2 < end1:
# start time of second entry is before end time of first entry
erroneous = True
else:
minutes_paused += (start2 - end1).total_seconds() / 60
if (day_end - day_begin).total_seconds() / 60 > 6 and minutes_paused == 0:
# employee hasn't booked pauses but all as working time;
# or hasn't done any pause even though he/she is obliged to do so if working >6h
erroneous = True
# minimum pause according to Austrian labor law if working >6h
minutes_paused = 30
return pd.Series({
'from':day_begin.strftime("%H:%M"),
'to':day_end.strftime("%H:%M"),
'hours_working':minutes_working / 60,
'hours_paused':minutes_paused / 60,
'error':erroneous})
df_sums = df.groupby(['date_at']).apply(custom_groupby)
df_sums
正如您可以看到的那样,
2019-11-05
的分组单元格值与2019-11-04
的分组单元格值相同,如果您在自定义函数中启用打印(数据)
,您将看到它始终是组1,但为什么?这似乎是由行引起的
data.sort_values(by=['start'], inplace=True, ascending=True)
由于data
只是原始数据帧df
的一个视图(而不是副本),因此在应用函数中使用inplace=True
进行排序可能会造成与在列表上循环时修改列表类似的问题。将线路更改为
data = data.sort_values(by=['start'], ascending=True)
创建一个副本。然后应用程序按预期工作。或者,您可以在分组之前尝试排序df
,以避免额外的内存使用
data = data.sort_values(by=['start'], ascending=True)