讲师中心 微信公众号
AI工具推荐 视频效率加速

如何基于同日邻近时刻与前两日相同时刻进行电力时序数据缺失值插补

胖涛同学_2152

胖涛同学_2152

发布时间:2026-05-21 12:46:05

|

229人浏览过

|

来源于php中文网

原创

如何基于同日邻近时刻与前两日相同时刻进行电力时序数据缺失值插补

本文介绍一种针对电力负荷时间序列数据的精细化缺失值插补方法:对每个缺失点,综合考虑当日前后各2个相邻时间点(如01:00缺失时取00:00、00:30、01:30、02:00)、以及前2天同一时刻共5个有效观测值的均值进行填充。

本文介绍一种针对电力负荷时间序列数据的精细化缺失值插补方法:对每个缺失点,综合考虑当日前后各2个相邻时间点(如01:00缺失时取00:00、00:30、01:30、02:00)、以及前2天同一时刻共5个有效观测值的均值进行填充。

在电力负荷分析中,缺失值往往具有强时空相关性——同一电表的日间模式稳定,且相邻时刻及历史同期(如同一时刻前1–2天)的读数高度相似。简单使用全局均值或线性插值会忽略这一特性,导致插补偏差。本文提出一种时空协同插补策略:对任意缺失值 df.loc[i, col](col 为时间列如 '01:00'),构造候选值集合:

  • 同日邻近值:取该行所在日期(date)下,col 列前后各2个非空时间点(需确保列名按时间顺序排列);
  • 历史同期值:取该行 date - pd.Timedelta('1D') 和 date - pd.Timedelta('2D') 对应行中 col 列的值(若存在且非空);
  • 最终插补值:上述最多5个有效数值的算术平均值。

✅ 关键前提:时间列('00:00', '00:30', ..., '23:30')必须按升序排列,且 date 列为 datetime64 类型。

以下为完整实现代码(含健壮性处理):

import pandas as pd
import numpy as np

def impute_electricity_ts(df, time_cols=None):
    """
    基于同日邻近时刻 + 前2天同期时刻的均值插补电力时序缺失值

    Parameters:
    -----------
    df : pd.DataFrame
        输入DataFrame,含 'meter IDs', 'date' 及多个时间列(如 '00:00')
    time_cols : list of str, optional
        时间列名列表;若为None,则自动识别除 'meter IDs' 和 'date' 外的所有列

    Returns:
    --------
    pd.DataFrame : 插补后的DataFrame(原地修改并返回)
    """
    # 确保date列为datetime类型
    df = df.copy()
    df['date'] = pd.to_datetime(df['date'])

    # 自动识别时间列
    if time_cols is None:
        time_cols = [c for c in df.columns if c not in ['meter IDs', 'date']]

    # 按meter ID和date排序,确保时序连续
    df = df.sort_values(['meter IDs', 'date']).reset_index(drop=True)

    # 构建日期索引映射:{meter_id: {date: row_idx}}
    idx_map = {}
    for mid, group in df.groupby('meter IDs'):
        idx_map[mid] = {row['date']: idx for idx, row in group.iterrows()}

    # 遍历每个时间列
    for col in time_cols:
        for i in range(len(df)):
            if pd.isna(df.at[i, col]):
                mid = df.at[i, 'meter IDs']
                curr_date = df.at[i, 'date']

                candidates = []

                # 1. 同日邻近时刻(前后各2个)
                # 获取当前行所在日期的所有时间点值(非空)
                same_day_rows = df[(df['meter IDs'] == mid) & (df['date'] == curr_date)]
                if not same_day_rows.empty:
                    # 提取所有时间列值(转为Series便于索引)
                    time_series = same_day_rows.iloc[0][time_cols]
                    col_pos = time_cols.index(col)
                    # 前2个:max(0, col_pos-2) 到 col_pos-1
                    prev_pos = max(0, col_pos - 2)
                    for j in range(prev_pos, col_pos):
                        val = time_series.iloc[j]
                        if pd.notna(val):
                            candidates.append(val)
                    # 后2个:col_pos+1 到 min(len-1, col_pos+2)
                    next_pos = min(len(time_cols), col_pos + 3)
                    for j in range(col_pos + 1, next_pos):
                        val = time_series.iloc[j]
                        if pd.notna(val):
                            candidates.append(val)

                # 2. 前2天同期时刻
                for offset in [1, 2]:
                    ref_date = curr_date - pd.Timedelta(f'{offset}D')
                    if ref_date in idx_map[mid]:
                        ref_idx = idx_map[mid][ref_date]
                        val = df.at[ref_idx, col]
                        if pd.notna(val):
                            candidates.append(val)

                # 插补:取均值(至少1个候选值才填充,否则保持NaN)
                if candidates:
                    df.at[i, col] = np.mean(candidates)

    return df

# 使用示例
# 假设原始df已加载
# result_df = impute_electricity_ts(df)

注意事项与优化建议:

  • 性能提示:对大规模数据(>10万行),上述逐行循环可能较慢。可改用 groupby('meter IDs').apply() 并向量化内部逻辑,或借助 numba 加速。
  • 边界处理:首日/末日缺失值无法获取前2天数据,函数自动跳过;首/末时间点(如 '00:00' 或 '23:30')缺少前后邻近值,仅使用可用部分。
  • 扩展性:可通过参数 window_size=2 和 history_days=[1,2] 封装为通用接口,适配不同粒度(如15分钟)或历史窗口。
  • 验证建议:插补后建议绘制某电表连续多日的热力图(seaborn.heatmap),目视检查插补值是否符合日周期规律。

该方法兼顾物理可解释性与统计稳健性,在真实电力场景中显著优于单一维度插补,是负荷数据预处理的推荐实践。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1631

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

3964

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1629

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

22837

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2807

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2847

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1123

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn