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