Python实现时间序列缺失小时与缺失值补全方案
小时级时间序列整时段缺失补全方案
补全核心逻辑是先搭完整的时间+维度基准骨架,再匹配原数据,最后按业务规则填值,不要直接在原始跳点数据上插值,会漏记录。
步骤1:生成无跳点的标准时间基准
首先生成覆盖全周期的小时级时间序列,必须包含所有应存在的时间点,不能有跳漏:
- 时间范围固定从
2022-06-23 00:00:00到2022-07-06 23:00:00,步长1小时 - 每个时间点自动拆解出
date(YYYY-MM-DD格式)、hour(0-23整数)、datetime三个标准时间字段
参考实现(pandas):
import pandas as pd # 生成全周期小时级时间序列,左闭右开保证覆盖最后一天23点 time_seq = pd.date_range(start="2022-06-23", end="2022-07-07", freq="H", inclusive="left") time_base = pd.DataFrame({ "datetime": time_seq, "date": time_seq.strftime("%Y-%m-%d"), "hour": time_seq.hour })
步骤2:匹配全量维度组合生成完整基准行
因为同一小时下存在多条不同维度属性(col_1/col_2/col_3取值不同)的记录,必须先对齐维度组合,否则补时间点时会漏维度记录:
- 先提取原数据中所有出现过的
col_1、col_2、col_3去重组合,过滤掉全空的无效维度 - 将时间基准和维度组合做交叉连接,生成「每个整点+每个合法维度组合」的全量基准表
- 特殊情况处理:如果维度是动态变化的(比如某维度组合仅在部分时段生效),先记录每个维度组合的有效起止时间,仅在生效时间范围内生成对应行,不要直接做全周期笛卡尔积,避免生成不存在的无效记录
参考实现:
# 提取静态全量维度组合(维度固定无变化场景用) dim_set = df[["col_1", "col_2", "col_3"]].drop_duplicates().dropna(how="all") # 交叉连接生成全量基准 time_base["_join_key"] = 1 dim_set["_join_key"] = 1 full_base = pd.merge(time_base, dim_set, on="_join_key").drop("_join_key", axis=1)
步骤3:关联原始数据定位缺失记录
将全量基准表和原始数据表,通过datetime、col_1、col_2、col_3四个字段做左连接:
- 原数据中存在的记录会自动匹配到对应的
total值 - 原数据中缺失的整小时记录,对应行的
total字段为空,所有缺失时段会被完整展开,不会再出现时间跳点
参考实现:
merged_df = pd.merge( full_base, df[["datetime", "col_1", "col_2", "col_3", "total"]], on=["datetime", "col_1", "col_2", "col_3"], how="left" )
步骤4:按业务规则填充缺失的total值
不要统一用全局均值填充,根据total的指标属性选对应填充逻辑:
- 若为流量、计数类指标(如访问量、订单量):优先用同维度下同星期几同时段的历史均值填充,其次可以用缺失点前后1-2小时的同维度均值填充,贴合时段波动规律
- 若为状态、属性类指标(如设备状态、固定阈值):用同维度组合上一个非空有效值向前填充即可
- 若缺失时段为已知的停摆期(如系统维护、业务关停):直接将对应缺失值填0,无需用统计值填充
参考实现(同星期同时段均值填充,适合流量类指标):
# 先按维度+时间排序 merged_df = merged_df.sort_values(["col_1", "col_2", "col_3", "datetime"]).reset_index(drop=True) # 提取星期字段用于周期匹配 merged_df["weekday"] = merged_df["datetime"].dt.weekday # 按维度+星期+小时分组,用组内均值填充缺失 merged_df["total"] = merged_df.groupby(["col_1", "col_2", "col_3", "weekday", "hour"])["total"].transform( lambda x: x.fillna(x.round(2)) )
步骤5:完整性校验
补全后必须做两轮校验,确认补全符合要求:
- 时间维度校验:按
date分组,每个日期下的hour字段去重计数必须为24,覆盖0-23所有整数,无跳点 - 记录数校验:维度固定的场景下,每个日期的总记录数=24*维度组合总数,和预期值一致即可
内容的提问来源于stack exchange,提问作者jack sumatra
相关产品推荐
相关产品推荐

