如何从小时级系统负载时序中提取每年峰值出现当日的全量数据?
基于Pandas的具体实现流程
所有操作可以直接在Python环境中基于pandas完成,无额外依赖:
- 时间字段预处理
原始数据的date_time如果是字符串格式,先转换为pandas可识别的时间类型,为后续时间维度拆分做准备:import pandas as pd # 读取小时级原始数据,替换为自身的文件路径即可 df_raw = pd.read_csv("hourly_system_load.csv", parse_dates=["date_time"]) - 拆分辅助时间维度
从完整时间戳中提取年份、纯日期两个字段,用于后续分组定位和数据匹配:df_raw["year"] = df_raw["date_time"].dt.year df_raw["date"] = df_raw["date_time"].dt.normalize() # 归一化为当日0点的时间格式,适配pandas的类型匹配规则 - 定位每年的负载峰值日期
按年份分组,定位每一年中system_load最高的那条记录,提取对应的日期值,得到覆盖2013-2020年全部峰值日的匹配清单:# 按年分组取每组内负载最大值的行索引 peak_row_idx = df_raw.groupby("year")["system_load"].idxmax() # 提取对应行的年、日期字段,生成年份-峰值日的匹配字典 peak_date_map = dict(zip(df_raw.loc[peak_row_idx, "year"], df_raw.loc[peak_row_idx, "date"])) - 筛选全量目标数据
用生成的峰值日映射规则,从原始数据中匹配所有属于峰值日的小时记录,去掉辅助字段后即为需要的目标数据框:# 给每一行数据匹配对应年份的峰值日,筛选日期匹配的所有行 df_target = df_raw[df_raw.apply( lambda x: x["date"] == peak_date_map[x["year"]], axis=1 )][["date_time", "system_load"]].reset_index(drop=True)
补充说明:如果原始数据存在小时缺失的情况,可以在筛选出峰值日后,按每个峰值日生成完整的0-23点时间序列,和当日已有负载值做左连接,保证输出为完整24小时的无缺测序列。
内容的提问来源于stack exchange,提问作者swhh
相关产品推荐
相关产品推荐

