You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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_weekhour设为复合索引,这样后续可以通过时间点的星期几和小时快速定位对应补全值:

# 把补全数据设置为(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

火山引擎 最新活动