2016-04-25 100 views
0

I组基础上的字段“计算机名”,“LocalIPAddress”,然后一个数据帧寻找各组连续日期之间的差值。日期的差异使用DIFF()

df2 = df.groupby(['MachineName', 'LocalIPAddress', 'DateTime'])['DateTime'].agg(
    ['count']).reset_index() 
df2['DateTime'] = pd.to_datetime(df2['DateTime']) 
df2['timedif'] = df2['DateTime'].diff() 

它非常适用第一组,而第二组的,它不会从头开始,而是从减去其先前记录的日期时间日期时间这是一个不同的组。

样本数据:

MachineName LocalIPAddress DateTime count timedif 
0 BMTSAFT04 10.18.0.186 2016-04-13 03:42:29.865 1 NaT 
1 BMTSAFT04 10.18.0.186 2016-04-13 08:48:33.005 1 05:06:03.140000 
2 BMTSAFT04 10.18.0.186 2016-04-13 10:16:28.612 1 01:27:55.607000 
3 BMTSAFT04 10.18.0.186 2016-04-13 10:31:33.343 1 00:15:04.731000 
4 BMTSAFT04 10.18.0.186 2016-04-13 23:43:12.068 1 13:12:56.580000 
5 BMTSYSP05 10.20.9.253 2016-04-13 06:08:53.584 1 -1 day +06:25:41 
6 BMTSYSP05 10.20.9.253 2016-04-13 12:01:57.563 1 05:53:03.979000 

第五行属于不同的组,这样的时间差不应该-1 day +06:25:41,它必须是NAT功能。我需要为每个分组应用差异逻辑。

任何帮助,将不胜感激!

回答

0

调用reset_index()后,df2不是pandas.core.groupby.DataFrameGroupBy类型的任何更长的时间。这是一个普通的pandas.core.frame.DataFrame,你不再能够在群组上操作,因为没有任何群组,只是一个普通的DataFrame。

总之,当你这样做:

df2['timedif'] = df2['Date'].diff() 

你实际上运行在整个系列中,“未分组”系列diff(),这就是为什么你得到你所得到的值。

如果这是您的样本数据框(您已经重置索引后):

In [222]: df_sample 
Out[222]: 
        DateTime LocalIPAddress MachineName count 
0 2016-04-13 03:42:29.865 10.18.0.186 BMTSAFT04  1 
1 2016-04-13 08:48:33.005 10.18.0.186 BMTSAFT04  1 
2 2016-04-13 10:16:28.612 10.18.0.186 BMTSAFT04  1 
3 2016-04-13 10:31:33.343 10.18.0.186 BMTSAFT04  1 
4 2016-04-13 23:43:12.068 10.18.0.186 BMTSAFT04  1 
5 2016-04-13 06:08:53.584 10.20.9.253 BMTSYSP05  1 
6 2016-04-13 12:01:57.563 10.20.9.253 BMTSYSP05  1 

在你的描述,你是说在某个时刻:

第5行属于不同的组

实际上,在重置索引之前,所有示例行都在不同的组中,因为您正在按许多不同的列进行分组。不过,我要承担你的意思是已通过MachineName在这种情况下,分组,我会按MachineName这里。

In [227]: df_sample.groupby('MachineName').apply(lambda x: x.DateTime.diff()) 
Out[227]: 
MachineName 
BMTSAFT04 0    NaT 
      1 05:06:03.140000 
      2 01:27:55.607000 
      3 00:15:04.731000 
      4 13:11:38.725000 
BMTSYSP05 5    NaT 
      6 05:53:03.979000 
Name: DateTime, dtype: timedelta64[ns] 

我希望这有助于!

+0

@ user3447653的是,在所有有用的东西,你想干什么? – Thanos