如何对多列pandas DataFrame重采样并按请求分组统计小时请求总量
问题原因分析
pd.read_csv默认不会解析时间类型字段,RequestDate会被识别为字符串,无法直接调用resample方法;同时resample方法要求作用对象为时间索引序列,直接对普通datetime列调用也会抛出错误。- 若确认csv存在
RequestDate字段仍报KeyError,大概率是读取后的列名带有多余前后空格,可先执行df.columns = df.columns.str.strip()去除空格后再操作。 - 你提供的测试csv中计数字段名为
RequestCount,和样例里的Count命名不同,统计时要对应正确的字段名。
正确实现代码
首先完成数据基础读取和类型转换:
import pandas as pd # 读取数据时直接解析时间列,避免后续手动转换 df = pd.read_csv("test_data.csv", parse_dates=["RequestDate"])
方式1:用dt.floor按小时取整后分组统计(写法更直观)
不需要修改索引,直接对时间列按小时取整后多字段分组求和即可:
# 按小时对齐时间、按请求类型分组,对调用量求和 df_result = df.groupby([df["RequestDate"].dt.floor("H"), "Request"])["RequestCount"].sum().reset_index() # 按需重命名列对齐你提供的输出样例 df_result = df_result.rename(columns={"RequestCount": "Count"}) print(df_result)
方式2:设置时间索引后用resample+groupby实现
如果你习惯用resample语法,可以先把时间列设为索引再操作:
# 将RequestDate设置为时间索引 df = df.set_index("RequestDate") # 先按请求类型分组,每个分组内按小时重采样求和,最后调整索引顺序、重置索引 df_result = df.groupby("Request").resample("H")["RequestCount"].sum().swaplevel().sort_index().reset_index() df_result = df_result.rename(columns={"RequestCount": "Count"}) print(df_result)
两种写法输出结果完全一致,都可以得到你期望的每小时各请求总调用量统计结果。
内容的提问来源于stack exchange,提问作者va0pjvbnd
相关产品推荐
相关产品推荐

