如何生成1小时间隔时间索引并为缺失时段填充随机完整数据行
实现代码
先修正你原有代码的逻辑问题,你之前写的df.join(df)属于笔误,且流程繁琐,以下是直接实现需求的完整代码:
import pandas as pd import numpy as np # 处理原始时间列,统一按小时取整 df['datetime'] = df['datetime'].dt.floor('H') # 生成覆盖整个周期的完整小时时间序列 full_hours = pd.date_range(df['datetime'].min(), df['datetime'].max(), freq='H') # 筛选出没有数据的缺失小时 missing_hours = full_hours[~full_hours.isin(df['datetime'].unique())] # 构建采样池:提取原始数据中所有非空的完整行,先把空字符串转成NaN统一处理 df = df.replace('', np.nan) sample_pool = df.dropna(subset=df.columns.difference(['datetime'])) # 为每个缺失小时生成100条填充数据 fill_list = [] for dt in missing_hours: # 从采样池随机抽取100行,允许重复采样适配采样池不足100行的场景 sampled = sample_pool.sample(n=100, replace=True, random_state=42).copy() # 统一替换为当前缺失的小时,不修改其他列内容 sampled['datetime'] = dt fill_list.append(sampled) # 合并原始数据与填充数据,按时间排序得到最终结果 df_result = pd.concat([df, pd.concat(fill_list)], ignore_index=True).sort_values('datetime').reset_index(drop=True)
注意说明
- pandas官方小时频率标识为
H,不要使用HR避免报错 - 代码中
random_state=42用于固定随机采样结果,不需要复现结果可直接删除该参数 - 如果原始数据本身没有空字符串占位的缺失行,可删除
df = df.replace('', np.nan)这行代码
内容的提问来源于stack exchange,提问作者purple_plop
相关产品推荐
相关产品推荐

