You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 08:50:02