使用 pandas,如何计算给定时间戳数据的最后一秒内的事件滚动数?

With pandas, how do I calculate a rolling number of events in the last second given timestamp data?

我有一个数据集,我可以根据请求和响应时间计算服务时间。我想在最后一秒添加一个请求的计算,以显示当我们每秒收到更多请求时系统变慢的明显关系。这是我拥有的数据,例如:

serviceTimes.head()
Out[71]: 
     Id                   Req_Time                   Rsp_Time     ServiceTime
0   3_1 2015-02-13 14:07:08.729000 2015-02-13 14:07:08.821000 00:00:00.092000
1   3_2 2015-02-13 14:07:08.929000 2015-02-13 14:07:08.929000        00:00:00
2  3_12 2015-02-13 14:11:53.908000 2015-02-13 14:11:53.981000 00:00:00.073000
3  3_14 2015-02-13 14:11:54.111000 2015-02-13 14:11:54.250000 00:00:00.139000
4  3_15 2015-02-13 14:11:54.111000 2015-02-13 14:11:54.282000 00:00:00.171000

为此,我想要一个类似这样的滚动数据集:

0 14:07:08 2
1 14:11:53 1
2 14:11:54 2

我试过 rolling_sum 和 rolling_count,但除非我使用错误或不理解周期函数,否则它对我不起作用。

对于您的问题,您似乎想使用拆分-应用-组合方法来汇总您的数据集。请参阅 here 以获取可帮助您使代码正常工作的文档,但基本上,您需要执行以下操作:

  • 创建一个新列(例如,'Req_Time_Sec 包括 Req_Time 到仅秒分辨率(例如 14:07:08.729000 变为 14:07:08
  • 使用 groups = serviceTimes.groupby('Req_Time_Sec) 根据每个请求发生的秒数将您的数据集分成子组。
  • 最后,通过计算每个子组的长度(表示那一秒的请求数)并将结果聚合到单个 DataFrame(类似于 new_df = groups.aggregate(len))来创建一个新数据集

以上都是未经测试的伪代码,但代码以及 link 文档应该可以帮助您到达目的地。

您首先需要将时间戳转换为字符串,然后将其分组,显示计数和平均服务时间:

serviceTimes['timestamp'] = [t.strftime('%y-%m-%d %H:%M') for t in serviceTimes.Req_Time]
serviceTimes.groupby('timestamp')['ServiceTime'].agg(['mean', 'count'])

或者,以适当的字符串格式创建请求时间的数据框,例如15-13-15 17:27,然后使用value_counts()计算每个时间戳的出现次数。您还可以很容易地绘制结果。

df = pd.DataFrame([t.strftime('%y-%m-%d %H:%M') for t in serviceTimes.Req_Time],
                   columns=['timestamp'])
response = df.timestamp.value_counts()
response.plot(rot=90)