如何扩展numpy、pandas、xarray格式的时间序列,将缺失记录填充为NaN值
我之前处理时间序列数据的时候经常碰到这种缺失时间点但没标记NaN的情况,其实xarray和pandas都有现成的高效方法解决,不用手动去定位缺失位置,给你分两种场景详细说明:
处理xarray Dataset(
ds)的情况 xarray里的reindex方法简直是为这种场景量身定做的——我们只需要先构建出完整的目标时间序列,再用它对原数据集重新索引,缺失的时间点就会自动填充NaN。
基于你的示例代码,具体操作如下:
# 先构建完整的小时级时间序列,和原数据的起始、频率、总周期一致 full_time = pd.date_range("2000-01-01", freq="H", periods=365 * 5) # 对原Dataset重新索引,缺失位置自动填充NaN ds_full = ds.reindex(time=full_time)
执行完之后,ds_full的time维度就会恢复到365×5的完整长度,之前缺失的30个时间点对应的foo值都会变成NaN,完全符合你的需求。
处理pandas DataFrame(
df)的情况 如果是处理pandas的DataFrame,用asfreq方法会更便捷,不过要确保你的DataFrame的索引是时间类型索引(你的示例里ds.to_dataframe()之后,time列已经自动变成了索引,刚好满足条件)。
具体代码:
# 按小时频率填充缺失时间点,缺失值自动设为NaN df_full = df.asfreq('H')
要是你的DataFrame里time还不是索引,先执行这一步转换就行:
df = df.set_index('time') df_full = df.asfreq('H')
这样处理后,df_full的行数就会恢复到365×5,缺失的时间点对应的数值列都会被填充为NaN。
这两种方法都不需要手动去统计或定位缺失的位置,工具会自动帮我们完成所有脏活,效率超高~
内容的提问来源于stack exchange,提问作者hlee
相关产品推荐
相关产品推荐

