首页 > 解决方案 > 以 10 秒为周期获取数据帧,并在该时间窗口内获取平均值

问题描述

我有一个看起来像这样的熊猫数据框(经过一些预处理):

[       doctets     Real First Packet           Real End Packet          Duration
49         456   2013-02-04 15:47:04.590    2013-02-04 15:47:04.654           64
50         456   2013-02-04 15:53:17.338    2013-02-04 15:53:17.466          128
...        ...                     ...                     ...               ...
10816    47087   2013-02-15 16:41:54.807    2013-02-15 16:42:01.335          6528
10817      168   2013-02-15 16:42:28.770    2013-02-15 16:42:28.898          128

我需要我的数据框的每一行之间的时间

start_date = datetime.datetime(2013, 2, 4, 8, 00, 00) #Feb 4 2013 at 8 am
end_date = datetime.datetime(2013, 2, 15, 17, 00, 00) #Feb 15 2013 at 5 pm

即使给定窗口没有数据,我也希望窗口中的平均比率 docects/duration 为 10 秒。我想要的输出应该是这样的:

[                  window                           doctects/duration         
  2013-02-04 8:00:00 - 2013-02-04 8:00:10                      0
  2013-02-04 8:00:11 - 2013-02-04 8:00:21                      0
  2013-02-04 8:00:21 - 2013-02-04 8:00:31                  7.123
         .                                                     .
         .                                                     .
         .                                                     .
         .                                                     .
  2013-02-15 16:59:51 - 2013-02-15 17:00:00                 6.987]

我首先尝试这样做:

   df.asfreq(freq='10S')

但我不确定还有什么可以尝试的。请任何指导表示赞赏。

标签: pythonpandasdataframedatetimeaverage

解决方案


使用grouper和 apply 你可以实现你想要的。我已经合成了数据

import numpy as np

r = pd.date_range("2013-02-04 8:00:00", freq="S", periods=60)
df = pd.DataFrame({"Real First Packet":r, "Real End Packet":r.shift(5),"doctets":np.random.randint(168,47087,len(r)),
             "duration":np.random.randint(64,6528, len(r))})

df.groupby(pd.Grouper(key="Real First Packet", freq="10S")).apply(
    lambda r: pd.Series({
        "window":r["Real First Packet"].min().strftime("%Y-%m-%d %H:%M:%S") + " - " + r["Real First Packet"].max().strftime("%Y-%m-%d %H:%M:%S"),
        "doctets/duration":(r.doctets/r.duration).mean()})
).reset_index(drop=True)

输出

窗户 文档/持续时间
0 2013-02-04 08:00:00 - 2013-02-04 08:00:09 23.0205
1 2013-02-04 08:00:10 - 2013-02-04 08:00:19 47.8008
2 2013-02-04 08:00:20 - 2013-02-04 08:00:29 15.8908
3 2013-02-04 08:00:30 - 2013-02-04 08:00:39 14.7253
4 2013-02-04 08:00:40 - 2013-02-04 08:00:49 17.7554
5 2013-02-04 08:00:50 - 2013-02-04 08:00:59 24.8611

推荐阅读