如何补全光伏逆变器API返回的指定时段缺失数据?
数据补全方案
核心思路
- 按日期拆分数据,单独处理每一天的记录
- 生成当天4:00到21:00的完整时间序列(匹配原始数据的时间间隔)
- 分两段填充缺失值:4:00-6:00的缺失值填0;当日现有最后一条记录到21:00的缺失值填当日
day_power的最大值 - 合并所有日期的补全数据,得到最终结果
具体实现步骤(以Python Pandas为例)
1. 预处理原始数据
先把DateTime列转为datetime类型,提取日期作为分组依据:
import pandas as pd # 假设原始数据存储在df中,包含DateTime和day_power列 df['DateTime'] = pd.to_datetime(df['DateTime']) df['date'] = df['DateTime'].dt.date
2. 按日期分组处理
遍历每个日期的数据,生成目标时间范围的完整序列并填充:
filled_dfs = [] # 按日期分组处理每一天的数据 for date, group in df.groupby('date'): # 生成当天4:00到21:00的完整时间序列,freq参数需匹配原始数据的时间间隔(示例为15分钟) start_time = pd.Timestamp(date) + pd.Timedelta(hours=4) end_time = pd.Timestamp(date) + pd.Timedelta(hours=21) full_time_range = pd.date_range(start=start_time, end=end_time, freq='15min') # 将分组数据转为DateTime索引,方便合并 group = group.set_index('DateTime') # 合并完整时间序列与原始数据,得到带缺失值的数据集 merged = pd.DataFrame(index=full_time_range).join(group) # 填充4:00-6:00的缺失值为0 morning_mask = (merged.index.hour >= 4) & (merged.index.hour < 6) merged.loc[morning_mask, 'day_power'] = merged.loc[morning_mask, 'day_power'].fillna(0) # 获取当日现有数据的最后一条记录时间,填充后续缺失值为当日day_power最大值 last_record_time = group.index.max() evening_mask = merged.index > last_record_time max_day_power = group['day_power'].max() merged.loc[evening_mask, 'day_power'] = merged.loc[evening_mask, 'day_power'].fillna(max_day_power) # 重置索引并整理列名 merged = merged.reset_index().rename(columns={'index': 'DateTime'}) filled_dfs.append(merged) # 合并所有日期的补全数据 final_df = pd.concat(filled_dfs, ignore_index=True)
3. 注意事项
- 时间间隔参数
freq需与原始数据一致,比如原始数据为1小时一次则设为'H',5分钟一次则设为'5min' - 若某天无任何原始记录,需额外处理:4:00-6:00填0,6:00-21:00可根据业务需求补充(如填0或默认值)
- 若某天所有
day_power均为缺失值,最大值会返回NaN,需单独判断处理
内容的提问来源于stack exchange,提问作者akayh
相关产品推荐
相关产品推荐

