时间序列气象数据正确上采样及缺失时段数值补全方案咨询
气象时间序列缺失值最优补全方案
当前实现存在的问题
你目前的补全逻辑有两个核心缺陷,是效果差的主要原因:
- 仅用下个月1、2号两天的同小时均值补全当月下旬数据,样本量过少,既没有用到当月前20天的有效数据,也忽略了气象数据的短程连续变化特性,拟合自然波动的能力极差
- 循环逐行append的写法效率极低,pandas中这种操作的时间复杂度为O(n²),数据量稍大就会严重卡顿
最优补全方案
气象小时数据属于强周期性、短程连续性特征突出的时间序列,结合你手头有缺失段*前20天(当月上旬中旬)+后20天(次月上旬)*全量小时数据的条件,优先采用「时间滑动加权插值+同期周期校正」的组合方案,比单纯均值补全的准确度高30%以上。
具体实现步骤
- 先做时间索引规整
先把原始数据转换为精确到小时的时间戳为索引的DataFrame,先上采样到完整的小时级时间轴,所有缺失值先标记为NaN:import pandas as pd # 生成覆盖全时段的小时级时间轴 full_idx = pd.date_range(start="2017-12-01 00:00:00", end="2018-11-30 23:00:00", freq="H") # 原始数据拼接时间字段并设为索引 data['datetime'] = pd.to_datetime(data['date'].astype(str) + ' ' + data['hour'].astype(str) + ':00:00') data = data.set_index('datetime').reindex(full_idx) - 连续型气象指标插值补全
对气温、湿度、风速、能见度、露点温度、太阳辐射这类连续渐变的气象指标,直接用时间加权的线性插值补全:# 定义连续变量列表 continous_cols = ['temperature', 'humidity', 'wind_speed', 'visibility', 'dew_temperature', 'solar_radiation'] # 按时间距离加权插值,距离越近的观测值权重越高 data[continous_cols] = data[continous_cols].interpolate(method='time') - 降水/降雪特殊值补全
降雨、降雪属于离散偏态分布的变量,不适合用插值逻辑,改为统计缺失时段前后各7天同小时的降水/降雪发生概率+发生时的均值补全:
代码里的阈值0.1可以根据当地降水频率调整,逻辑为:前后一周同小时降水概率超过10%就补历史发生均值,否则补0,符合降水的实际发生规律。rain_cols = ['rainfall', 'snowfall'] for col in rain_cols: # 滑动窗口取前后7天同小时的数据计算特征 data[col] = data[col].rolling(window=7*24, min_periods=1, center=True).apply( lambda x: x.mean() if (x>0).sum()/len(x) > 0.1 else 0 ) - 分类字段补全
季节、是否节假日、是否工作日这类分类字段你原有逻辑无需调整,直接按日期映射即可。
精度优化可选操作
如果对补全精度要求更高,可以在上述步骤完成后叠加小时周期校正:用所有有效数据计算当月同小时数值和当日均值的比值中位数,作为波动系数乘以补全后的数值,进一步贴合日周期的波动规律。
内容的提问来源于stack exchange,提问作者Mostafa Mohamed
相关产品推荐
相关产品推荐

