pandas groupby 频率 5s

pandas groupby freq 5s

我加载了一个包含网络流量的 .csv,并将时间放在索引中。我按"ipdst proto and time".

组数
...
df['time'] = pd.to_datetime(df['time'])
df.index = df['time']
data = df.copy()

data_group = pd.DataFrame({'count': data.groupby(['ipdst', 'proto', data.index]).size()}).reset_index()
data_group

输出:

ipdst           proto   time                   count
10.3.20.102     HTTP    2017-03-20 17:08:56     1
10.3.20.102     HTTP    2017-03-20 17:08:57     1
10.3.20.102     HTTP    2017-03-20 17:08:58     1
10.3.20.102     HTTP    2017-03-20 17:08:58     1
10.3.20.102     TCP     2017-03-20 17:08:59     3

现在我想看看"ipdst"和"protocol"以5s的时间频率重复。喜欢下一个:

  ipdst       proto  time                 count     
    -           -    2017-03-20 17:08:50    0
10.3.20.102    HTTP  2017-03-20 17:08:55    4
10.3.20.102    TCP   2017-03-20 17:08:55    4
    -           -    2017-03-20 17:09:00    0

让我们使用 groupbyresamplesumreset_index:

df.groupby(['ipdst','proto']).resample('5S', on='time').sum().reset_index()

或(如果您使用的是 0.19.0 之前的旧 Pandas)

df.set_index('time').groupby(['ipdst','proto']).resample('5S').sum().reset_index()

输出:

         ipdst proto                time  count
0  10.3.20.102  HTTP 2017-03-20 17:08:55      4
1  10.3.20.102   TCP 2017-03-20 17:08:55      3

或者您也可以按照文的建议使用pd.Grouper。 pd.TimeGrouper is deprecated.

df.groupby([df['ipdst'],df['proto'],pd.Grouper(key='‌​time', freq='5s')])['count'].sum().reset_index()