Pandas中index.difference方法失效问题求助
问题分析与解决
问题背景
有一份1年的小时级时间序列数据,原始数据形状(8188, 3),存在部分缺失时间戳。通过df_hourly = temp_df.resample('h').asfreq()重采样生成包含全年所有小时时间戳的数据集(索引形状(8764,)),但执行new_rows = df_hourly.index.difference(original_index)获取缺失时间戳时,得到的new_rows形状为(8764,),和预期的576个缺失值不符。
问题根源
观察原始数据索引可以发现:
DatetimeIndex(['2023-05-22 02:00:04+00:00', '2023-05-22 03:00:03+00:00', ...], dtype='datetime64[ns, UTC]', name='_time', length=8188, freq=None)
所有原始时间戳都带有秒级偏移(如02:00:04、03:00:03),而重采样后的df_hourly索引是整点时间(如2023-05-22 02:00:00+00:00),两者时间戳完全不重合,因此difference会返回重采样后的全部索引。
另外你输出中提到df_hourly_index是RangeIndex,这大概率是打印错误——重采样后的索引应为DatetimeIndex。
解决方案
步骤1:将原始数据索引对齐到整点
先把带秒级偏移的时间戳向下取整到小时,同时处理同一小时内的重复数据:
temp_df['_time'] = pd.to_datetime(temp_df['_time']) # 把时间戳对齐到整点 temp_df['_time'] = temp_df['_time'].dt.floor('h') temp_df.set_index('_time', inplace=True) # 同一小时有多条数据时,按需求聚合(这里用first,也可替换为mean/median) temp_df = temp_df.groupby(temp_df.index).first() original_index = temp_df.index
步骤2:重采样并获取缺失时间戳
df_hourly = temp_df.resample('h').asfreq() new_rows = df_hourly.index.difference(original_index)
步骤3:用中位数填充缺失值
# 计算原始数据的整体中位数 median_value = temp_df['Total'].median() # 填充重采样后的缺失值 df_hourly.fillna(median_value, inplace=True)
完整修正代码
temp_df = temp_df[temp_df['cell'] == cell] print(temp_df.head()) temp_df.to_csv('temp_df.csv') print(temp_df.shape) # 处理时间戳:对齐到整点 temp_df['_time'] = pd.to_datetime(temp_df['_time']) temp_df['_time'] = temp_df['_time'].dt.floor('h') print(temp_df['_time'].dtype) # 设置索引并去重聚合 temp_df.set_index('_time', inplace=True) temp_df = temp_df.groupby(temp_df.index).first() original_index = temp_df.index print("original_index", original_index.shape) # 重采样生成全量小时索引 df_hourly = temp_df.resample('h').asfreq() print(df_hourly.index.shape) # 获取缺失时间戳 new_rows = df_hourly.index.difference(original_index) print("new_rows数量", len(new_rows)) # 此时应为8764-8188=576左右 # 中位数填充缺失值 median_value = temp_df['Total'].median() df_hourly.fillna(median_value, inplace=True)
内容的提问来源于stack exchange,提问作者Ravi kant Gautam
相关产品推荐
相关产品推荐

