Pandas使用groupby与resample按设备和分钟级时间戳统计事件数并补0
实现代码
方法1:用resample直接实现(更简洁)
pandas的resample方法本身就支持补全缺失的时间区间,直接按设备分组后重采样统计即可:
import pandas as pd # 第一步:将timestamp列转为datetime类型 df["timestamp"] = pd.to_datetime(df["timestamp"]) # 第二步:按device分组后,按分钟粒度重采样统计数量,自动补全缺失分钟 df_count = ( df.set_index("timestamp") .groupby("device", group_keys=False) .resample("T")["id"] .count() .reset_index(name="count") ) # 第三步:格式化时间为你需要的字符串格式 df_count["timestamp"] = df_count["timestamp"].dt.strftime("%Y-%m-%d %H:%M")
方法2:手动生成全量时间设备组合
如果需要自定义时间范围(比如不需要局限于现有数据的时间区间),可以手动生成全量组合后合并统计结果:
import pandas as pd # 预处理:转datetime、截断到分钟 df["timestamp"] = pd.to_datetime(df["timestamp"]) df["minute_ts"] = df["timestamp"].dt.floor("min") # 统计现有数据的分钟级计数 exist_count = df.groupby(["device", "minute_ts"])["id"].count().reset_index(name="count") # 生成全量的设备+分钟组合 # 可自行修改起止时间,这里默认取现有数据的最小到最大分钟 all_devices = df["device"].unique() full_minutes = pd.date_range( start=df["minute_ts"].min(), end=df["minute_ts"].max(), freq="T" ) full_grid = pd.MultiIndex.from_product( [all_devices, full_minutes], names=["device", "minute_ts"] ).to_frame(index=False) # 合并结果,缺失计数填充为0 result = pd.merge(full_grid, exist_count, on=["device", "minute_ts"], how="left").fillna(0) result["count"] = result["count"].astype(int) # 格式化输出 result["timestamp"] = result["minute_ts"].dt.strftime("%Y-%m-%d %H:%M") result = result[["device", "timestamp", "count"]]
规则适配说明
- 用
resample("T")或者dt.floor("min")做时间截断,严格保证同一分钟的事件归为同一组,不同日期/小时的事件不会错误合并,完全符合分组规则 - 如果你的设备列实际名为
cameraId,直接替换代码里的device为对应列名即可
内容的提问来源于stack exchange,提问作者user1315621
相关产品推荐
相关产品推荐

