如何将pandas时间序列数据按规则汇总分配到15分钟时间槽
实现步骤及代码
核心逻辑:按照规则不需要拆分跨时间槽的区间,所有记录的mw_values全额归属begin时间所在的15分钟槽,只需给每条记录打槽位标签后分组求和,再补全空槽即可。
步骤1:导入依赖并处理基础数据
import pandas as pd # 构造示例数据,实际使用时替换为你自己的DataFrame即可 data = { "begin": ["2021-09-14 11:16:00", "2021-09-14 11:27:11", "2021-09-14 11:30:00", "2021-09-14 11:33:59", "2021-09-14 11:39:42"], "end": ["2021-09-14 11:27:11", "2021-09-14 11:30:00", "2021-09-14 11:33:59", "2021-09-14 11:39:42", "2021-09-14 11:59:59"], "mw_values": [0, 100, 1200, 600, 400] } df = pd.DataFrame(data) # 把begin列转为pandas datetime类型 df["begin"] = pd.to_datetime(df["begin"])
步骤2:生成每条记录归属的15分钟槽位标签
使用pandas内置的dt.floor方法可以直接对时间向下取整到15分钟粒度,刚好匹配规则要求的槽位归属逻辑:
df["time_slots_15_min"] = df["begin"].dt.floor("15T")
步骤3:按槽位分组求和
sum_df = df.groupby("time_slots_15_min", as_index=False)["mw_values"].sum().rename(columns={"mw_values": "sum_mw_values"})
步骤4:补全无数据的空槽位(可选,按需使用)
如果需要输出连续的15分钟槽位、无数据的槽位填0,可以执行以下代码:
# 生成完整的时间槽序列,start和end可以根据你实际需要的统计范围自定义调整 full_slots = pd.date_range( start=sum_df["time_slots_15_min"].min().floor("H"), end=sum_df["time_slots_15_min"].max().ceil("H"), freq="15T" ).to_frame(name="time_slots_15_min", index=False) # 合并补全空值 result = pd.merge(full_slots, sum_df, on="time_slots_15_min", how="left").fillna(0) result["sum_mw_values"] = result["sum_mw_values"].astype(int)
运行后输出的result和你提供的示例结果完全一致。
内容的提问来源于stack exchange,提问作者Thomas Kutsch
相关产品推荐
相关产品推荐

