Python DataFrame自定义GroupBy函数接收到错误数据

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

我有一个时间追踪工具的数据。在这些数据中,我试图按天对数据进行分组,并对暂停、开始和结束时间进行一些计算。因此,我将应用一个自定义组函数。但不知何故,在该函数中接收到的数据总是来自第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
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)