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
相关产品推荐
相关产品推荐

