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

Pandas datetime范围匹配后ACTIVE列出现NaN问题求助

问题解决方向

1. 先验证时间列的实际类型与格式一致性

虽然你说明所有时间列都是datetime64[ns]类型,但实际可能存在解析异常:

  • 检查df1的age列格式,比如第二行的31-01-2019是DD-MM-YYYY格式,若pandas解析时默认按MM-DD-YYYY处理,会因月份不存在报错;如果没报错,大概率该列实际是object类型而非datetime。执行以下代码确认:
    print(df1['age'].dtype)
    print(df2['Start_Time'].dtype, df2['End_Time'].dtype)
    
  • 若存在类型不一致,重新标准化解析时间列:
    # 针对df1的DD-MM-YYYY格式
    df1['age'] = pd.to_datetime(df1['age'], format='%d-%m-%Y %H:%M')
    df2['Start_Time'] = pd.to_datetime(df2['Start_Time'])
    df2['End_Time'] = pd.to_datetime(df2['End_Time'])
    

2. 初始化ACTIVE列避免NaN

你的代码仅给匹配成功的行赋值True,未匹配的行会保留默认的NaN。若需要明确的布尔值,先初始化列:

df1['ACTIVE'] = False  # 先设为默认False
for index, row in df2.iterrows():
    start = row['Start_Time']
    end = row['End_Time']
    df1.loc[df1['age'].between(start, end), 'ACTIVE'] = True

3. 替换循环为高效的区间匹配逻辑

循环iterrows()效率低且容易出错,推荐用向量化方式实现区间匹配:

方法一:使用IntervalIndex

# 创建时间区间索引
intervals = pd.IntervalIndex.from_arrays(df2['Start_Time'], df2['End_Time'], closed='both')
# 检查每个age是否落在任意区间内
df1['ACTIVE'] = df1['age'].isin(intervals)

方法二:广播向量匹配

# 广播比较所有age与df2的时间区间
mask = (df1['age'].values[:, None] >= df2['Start_Time'].values) & (df1['age'].values[:, None] <= df2['End_Time'].values)
# 只要有一个区间匹配就设为True
df1['ACTIVE'] = mask.any(axis=1)

4. 排查循环内的匹配有效性

若坚持用循环,可在循环内添加调试输出,确认是否有匹配成功的行:

for index, row in df2.iterrows():
    start = row['Start_Time']
    end = row['End_Time']
    match_mask = df1['age'].between(start, end)
    print(f"区间{start}至{end}匹配到{match_mask.sum()}行")
    df1.loc[match_mask, 'ACTIVE'] = True

如果输出匹配行数为0,说明时间格式或区间范围确实不匹配,回到第一步检查时间列。

内容的提问来源于stack exchange,提问作者shan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:55:20