如何在Pandas中按星期几和小时补全缺失时段的时序数据?
使用Pandas补全时序数据缺失时段(按星期几+小时分组填充)
咱们一步步来搞定这个需求,核心思路是先构建覆盖全时段的完整时间轴,再利用「星期几+小时」的映射关系,把预先生成的补全数据精准填充到缺失区间里。
1. 准备工作:导入库并加载数据
首先确保你已经导入Pandas,然后把三组数据加载成DataFrame。假设你已经有了:
df_feb:2019-02-07至2019-02-17的小时级数据df_mar:2019-03-01至2019-03-11的小时级数据fill_df:按day_of_week(星期几,0-6)和hour(小时,0-23)分组的补全数据
import pandas as pd # 加载数据(这里假设你从文件读取,比如csv格式) df_feb = pd.read_csv("feb_data.csv", parse_dates=["t"], index_col="t") df_mar = pd.read_csv("mar_data.csv", parse_dates=["t"], index_col="t") fill_df = pd.read_csv("fill_data.csv")
2. 合并已有数据并构建完整时间轴
先把二月和三月的数据合并,然后生成包含缺失时段的完整小时级时间序列:
# 合并已有数据 combined_df = pd.concat([df_feb, df_mar]) # 生成覆盖全时段的小时级时间索引(保持UTC时区和原始数据一致) start_time = df_feb.index.min() end_time = df_mar.index.max() full_time_index = pd.date_range(start=start_time, end=end_time, freq="H", tz="UTC") # 将合并后的数据对齐到完整时间轴,缺失值会自动标记为NaN full_df = combined_df.reindex(full_time_index)
3. 处理补全数据:设置复合索引以便快速匹配
把补全数据的day_of_week和hour设为复合索引,这样后续可以通过时间点的星期几和小时快速定位对应补全值:
# 把补全数据设置为(day_of_week, hour)的复合索引 fill_df = fill_df.set_index(["day_of_week", "hour"])
4. 为缺失时段匹配补全数据并填充
遍历完整数据的缺失行,提取每个时间点的星期几(Pandas中.dayofweek返回0=周一,6=周日,要和你的补全数据编号一致)和小时,然后从补全数据中取值填充:
# 筛选出所有缺失数据的时间索引 missing_mask = full_df.isna().any(axis=1) missing_times = full_df[missing_mask].index # 逐个填充缺失值 for time in missing_times: day_of_week = time.dayofweek hour = time.hour # 从补全数据中取出对应分组的值 fill_values = fill_df.loc[(day_of_week, hour)] # 填充到完整数据中 full_df.loc[time, ["v_amm", "v_alc", "v_no2"]] = fill_values
5. 验证填充结果
最后可以检查一下缺失时段的填充情况,确保数据正确:
# 查看2019-02-17 22:00到2019-02-28 23:00的填充数据 print(full_df.loc["2019-02-17 22:00":"2019-02-28 23:00"])
注意事项
- 确保补全数据的
day_of_week编号和Pandas的.dayofweek规则一致(周一=0,周日=6),如果不一致,需要提前做映射转换。 - 所有时间序列要保持时区统一(这里用UTC和原始数据的
+00:00匹配),避免时区混乱导致的错误。
内容的提问来源于stack exchange,提问作者Joey




