如何按缺失数据块拆分DataFrame并按需插值?
处理带时间序列的DataFrame:按时间间隙拆分并插值
问题背景
我有一个带时间序列索引的DataFrame,包含数千行数据,但存在部分缺失值,示例数据如下:
A 2023-03-18 05:00:00 3.0 2023-03-18 06:00:00 4.0 2023-03-18 07:00:00 24.4 2023-03-18 12:00:00 5.6 2023-03-18 13:00:00 3.4 2023-03-18 15:00:00 4.5 2023-03-18 20:00:00 8.8 2023-03-18 21:00:00 3.2
原本我想把数据转为小时粒度,用resample()(或reindex())结合interpolate()插值缺失值,代码如下:
df = df.resample("1h").first() df = df.interpolate(method="time") df
执行后得到:
A 2023-03-18 05:00:00 3.00 2023-03-18 06:00:00 4.00 2023-03-18 07:00:00 24.40 2023-03-18 08:00:00 20.64 2023-03-18 09:00:00 16.88 2023-03-18 10:00:00 13.12 2023-03-18 11:00:00 9.36 2023-03-18 12:00:00 5.60 2023-03-18 13:00:00 3.40 2023-03-18 14:00:00 3.95 2023-03-18 15:00:00 4.50 2023-03-18 16:00:00 5.36 2023-03-18 17:00:00 6.22 2023-03-18 18:00:00 7.08 2023-03-18 19:00:00 7.94 2023-03-18 20:00:00 8.80 2023-03-18 21:00:00 3.20
当前需求
但我不想对超过3小时的大间隙进行插值,而是希望在这些大间隙处拆分DataFrame,最终得到多个DataFrame。预期结果是3个DataFrame:
第一个:
A 2023-03-18 05:00:00 3.00 2023-03-18 06:00:00 4.00 2023-03-18 07:00:00 24.40
第二个:
A 2023-03-18 12:00:00 5.60 2023-03-18 13:00:00 3.40 2023-03-18 14:00:00 3.95 2023-03-18 15:00:00 4.50
第三个:
A 2023-03-18 20:00:00 8.80 2023-03-18 21:00:00 3.20
思路补充
我的思路是寻找能对布尔序列进行连续逻辑处理的便捷函数。假设有布尔序列:[True, False, True, False, False, False, False, True, True, False, False, True]
我希望生成如下序列:[True, True, True, False, False, False, False, True, True, True, True, True]
也就是仅保留连续3个以上False对应的False值。
第一个布尔序列可通过以下代码获取:
~df.resample('1h').first().isnull().any(axis=1)
最终解决方案
感谢@triky提供的优秀方案,我也找到了类似问题的解决思路,最终使用以下代码实现:
# 指定阈值 th = pd.Timedelta(hours=3) # 计算分组 groups = (df.index.diff() > th).cumsum() # 按分组拆分DataFrame dfs = [g for _, g in df.groupby(groups)] # 后续处理:对每个子DataFrame做小时粒度重采样和插值 dfs = [ df.resample('1h').first().interpolate(method='time') for df in dfs]
内容的提问来源于stack exchange,提问作者RecursionError
相关产品推荐
相关产品推荐

