识别并更改组中的极端日期时间离群值

时间:2019-06-27 16:11:07

标签: python pandas

我有一个数据框的一部分,用于标识未与其他所有人(基本上是忘记挂断电话的人)同时断开连接的设备。我已经按UniqueCallID和LeaveTime对这个切片进行了排序,以便离群值始终是会议“组”中的最后一个离群值,并且如果差异大于x,我想将该离群值的LeaveTime更改为其前一个离场时间。时间(60分钟或1小时)。

我尝试了分组,但是datetime不允许我执行除count()之外的任何我理解的功能,而这对我没有太大帮助。我有一个UniqueCallID的列表,我想为该列表中的每个UniqueCallID都想要一个for循环,但是我不知道for循环中有什么。

我想比较每个UniqueCallID组的最后两行,并在时间上相距较远时采取行动。

这里是有关数据外观的一个概念。

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的LeaveTime读为2019-06-26 15:45:37,与索引值2相同。真正的索引值与原始数据帧绑定在一起,我想我打算将两者合并,覆盖索引定位的行。

1 个答案:

答案 0 :(得分:0)

我会这样:

df.groupby("UniqueCallID").apply(my_func,"delta")

其中delta是自第一次挂断以来的时间x(60分钟或1小时)之差;

delta = pd.Timedelta("60min")

我会这样写my_func:

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

这是您得到的:

#Output
    UniqueCallID           LeaveTime
0         1         2019-06-26 15:45:32
1         1         2019-06-26 15:45:32
2         1         2019-06-26 15:45:32
3         1         2019-06-26 15:45:32
4         2         2019-06-05 07:32:14
5         2         2019-06-05 07:32:14
6         2         2019-06-05 07:32:14
7         3         2019-06-21 15:42:37
8         3         2019-06-21 15:42:37
相关问题