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

Python Pandas实现同名时间区间布尔掩码筛选及跨表字段赋值

解决Pandas DataFrame按Name匹配时间区间并赋值的问题

前提准备:统一时间字段类型

首先确保所有时间字段为datetime类型,避免字符串比较引发异常:

import pandas as pd

# 转换时间字段为datetime类型
df['Start Time'] = pd.to_datetime(df['Start Time'])
df['End Time'] = pd.to_datetime(df['End Time'])
df2['Time'] = pd.to_datetime(df2['Time'])

方法一:合并后生成掩码(适用于单Name对应单时间区间)

  1. 按Name合并两个DataFrame,将df的时间区间和Occ字段关联到df2每一行:
merged_df = df2.merge(df[['Name', 'Start Time', 'End Time', 'Occ']], on='Name', how='left')
  1. 生成布尔掩码,标记Time是否处于对应Name的时间区间内:
mask = (merged_df['Time'] >= merged_df['Start Time']) & (merged_df['Time'] <= merged_df['End Time'])
  1. 将匹配到的Occ字段赋值给df2:
# 仅给匹配成功的行赋值,未匹配行留空(NaN)
df2['Occ'] = merged_df['Occ'].where(mask, pd.NA)

方法二:逐行匹配(适用于单Name对应多时间区间)

如果df中同一个Name对应多个时间区间,用apply逐行检查匹配:

  1. 生成布尔掩码:
df2['in_time_range'] = df2.apply(
    lambda row: not df[(df['Name'] == row['Name']) & 
                      (df['Start Time'] <= row['Time']) & 
                      (df['End Time'] >= row['Time'])].empty,
    axis=1
)
  1. 赋值Occ字段(取第一个匹配区间对应的Occ):
def assign_occ(row):
    matched_rows = df[(df['Name'] == row['Name']) & 
                     (df['Start Time'] <= row['Time']) & 
                     (df['End Time'] >= row['Time'])]
    return matched_rows['Occ'].iloc[0] if not matched_rows.empty else pd.NA

df2['Occ'] = df2.apply(assign_occ, axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:30:11