You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:51:28