Python 识别并更改组内的极端日期时间异常值

Python 识别并更改组内的极端日期时间异常值,python,pandas,Python,Pandas,我有一个数据帧片段,用于识别与其他人(基本上是忘记挂断电话的人)没有同时断开连接的设备。我已经按照UniqueCallID和LeaveTime对这个切片进行了排序,以便异常值始终是会议“组”中的最后一个,如果差值超过x时间(60分钟或1小时),我想将该异常值的LeaveTime更改为它之前的LeaveTime 我已经尝试过分组,但是datetime不允许我执行任何我理解的函数,除了count(),这对我没有什么用处。我有一个UniqueCallID的列表,我想我希望列表中的每个UniqueCal

我有一个数据帧片段,用于识别与其他人(基本上是忘记挂断电话的人)没有同时断开连接的设备。我已经按照UniqueCallID和LeaveTime对这个切片进行了排序,以便异常值始终是会议“组”中的最后一个,如果差值超过x时间(60分钟或1小时),我想将该异常值的LeaveTime更改为它之前的LeaveTime

我已经尝试过分组,但是datetime不允许我执行任何我理解的函数,除了count(),这对我没有什么用处。我有一个UniqueCallID的列表,我想我希望列表中的每个UniqueCallID都有一个for循环,但我不知道for循环中会出现什么

我想比较每一组的最后两行,如果它们在时间上相距很远,我会采取行动

下面是数据的大致情况

data={'UniqueCallID':[1, 1, 1, 1, 2, 2, 2, 3,3], 'LeaveTime': ['2019-06-26 15:45:32','2019-06-26 15:45:34','2019-06-26 15:45:37','2019-06-27 04:30:33','2019-06-05 07:32:14','2019-06-05 07:33:16','2019-06-05 11:06:22','2019-06-21 15:42:37','2019-06-22 18:30:42']}
df=pd.DataFrame(data)
df

我希望索引值3的离开时间读作2019-06-26 15:45:37,与索引值2相同。真正的索引值与原始数据帧相关联,我想我会计划将两者合并,覆盖索引所针对的行。

我会这样做:

df.groupby("UniqueCallID").apply(my_func,"delta")
def my_func(grouped,delta):
  first_leave_time = grouped["LeaveTime"].min()
  last_acceptable_leave_time = grouped.loc[grouped.LeaveTime<=first_leave_time+delta,"LeaveTime"].max()
  grouped.loc[grouped.LeaveTime>first_leave_time+delta,"LeaveTime"]=last_acceptable_leave_time
  return grouped
式中,delta是第一次挂断的时间差x(60分钟或1小时)

delta = pd.Timedelta("60min")
我会这样写我的函数:

df.groupby("UniqueCallID").apply(my_func,"delta")
def my_func(grouped,delta):
  first_leave_time = grouped["LeaveTime"].min()
  last_acceptable_leave_time = grouped.loc[grouped.LeaveTime<=first_leave_time+delta,"LeaveTime"].max()
  grouped.loc[grouped.LeaveTime>first_leave_time+delta,"LeaveTime"]=last_acceptable_leave_time
  return grouped

我会这样做:

df.groupby("UniqueCallID").apply(my_func,"delta")
def my_func(grouped,delta):
  first_leave_time = grouped["LeaveTime"].min()
  last_acceptable_leave_time = grouped.loc[grouped.LeaveTime<=first_leave_time+delta,"LeaveTime"].max()
  grouped.loc[grouped.LeaveTime>first_leave_time+delta,"LeaveTime"]=last_acceptable_leave_time
  return grouped
式中,delta是第一次挂断的时间差x(60分钟或1小时)

delta = pd.Timedelta("60min")
我会这样写我的函数:

df.groupby("UniqueCallID").apply(my_func,"delta")
def my_func(grouped,delta):
  first_leave_time = grouped["LeaveTime"].min()
  last_acceptable_leave_time = grouped.loc[grouped.LeaveTime<=first_leave_time+delta,"LeaveTime"].max()
  grouped.loc[grouped.LeaveTime>first_leave_time+delta,"LeaveTime"]=last_acceptable_leave_time
  return grouped

你的预期产量是多少?你的预期产量是多少?这很好。非常感谢你。一个问题:分组来自哪里?它是原始数据帧切片,还是一个中间步骤,类似于groupby UniqueCallID而不应用函数?我不确定的是,它是如何迭代每个UniqueCallId的,很明显,但它是如何迭代的?调用“分组”同一类别中的一组项:callID=1的所有项都分组在一起。因此,对于这些组中的每一组,你都应用了我函数中的内容:因此你取最小值,然后找到最后一个可接受的值,等等。。。最后,返回修改分组。熊猫知道把它放在哪里。嗯,我在某个地方看到了一个很好的描述。。。也许是熊猫食谱上的那本。这本很不错。非常感谢你。一个问题:分组来自哪里?它是原始数据帧切片,还是一个中间步骤,类似于groupby UniqueCallID而不应用函数?我不确定的是,它是如何迭代每个UniqueCallId的,很明显,但它是如何迭代的?调用“分组”同一类别中的一组项:callID=1的所有项都分组在一起。因此,对于这些组中的每一组,你都应用了我函数中的内容:因此你取最小值,然后找到最后一个可接受的值,等等。。。最后,返回修改分组。熊猫知道把它放在哪里。嗯,我在某个地方看到了一个很好的描述。。。也许是熊猫食谱上的那本书。