如何高效获取Pandas DataFrame含NaN列的日期索引区间?
高效找出Pandas DataFrame中各列NaN值的连续日期索引区间
可以利用Pandas的向量化分组操作实现,完全避免逐行循环,核心思路是标记连续NaN块并聚合起止索引:
1. 定义单列处理函数
def get_nan_intervals(series): # 标记当前序列的NaN位置 is_nan = series.isna() if not is_nan.any(): return [] # 生成连续NaN块的分组键:当NaN状态发生变化时,分组ID递增 nan_groups = is_nan.ne(is_nan.shift()).cumsum()[is_nan] # 按分组键聚合,提取每个连续块的首尾索引并转为元组列表 intervals = nan_groups.groupby(nan_groups).agg(['first', 'last']).apply(tuple, axis=1).tolist() return intervals
2. 批量处理目标列
基于你已筛选出的含NaN列列表,批量生成各列的连续NaN区间字典:
# 生成各列对应的NaN连续区间 nan_intervals_dict = { col: get_nan_intervals(boundaries[col]) for col in boundaries_with_incomplete_days }
关键逻辑说明
is_nan.ne(is_nan.shift()).cumsum():通过对比当前行与前一行的NaN状态,状态切换时生成新的分组ID,累加后得到每个连续NaN块的唯一标识,实现无循环的连续块标记。groupby(nan_groups).agg(['first', 'last']):按连续块分组,直接提取每个块的起始和结束日期索引,聚合操作是Pandas内部优化的向量化计算,效率远高于逐行遍历。
输出示例
对于你给出的示例场景,nan_intervals_dict中对应列的结果会是:
[('2024-01-03 2:00:00', '2024-01-03 8:00:00'), ('2024-01-07 2:00:00', '2024-01-07 12:00:00')]
内容的提问来源于stack exchange,提问作者Diego L
相关产品推荐
相关产品推荐

