如何按另一列指定值的条件过滤Pandas DataFrame的日期列数据
Pandas DataFrame 多日期列条件过滤实现方案
核心逻辑
你需要过滤的是同时满足proc_date为昨日前一天、且result_date小于昨日UTC 10:30的行,等价于保留所有不满足上述组合条件的行,直接对需要排除的条件取反即可。
完整实现代码
首先需要先计算基准时间,再做条件匹配,注意先统一日期列的类型避免比较出错:
import pandas as pd # 1. 计算UTC基准时间 utc_now = pd.Timestamp.utcnow() # 昨日UTC时间 yday = utc_now - pd.Timedelta(days=1) # 昨日的前一天(取日期部分,和proc_date格式对齐) day_before_yday = (yday - pd.Timedelta(days=1)).date() # 昨日UTC 10:30时间截断点 yday_1030_cutoff = yday.replace(hour=10, minute=30, second=0, microsecond=0) # 2. 统一列类型(如果你的列已经是对应类型可以跳过这步) # proc_date转成日期类型 df['proc_date'] = pd.to_datetime(df['proc_date']).dt.date # result_date转成UTC时区的datetime类型 df['result_date'] = pd.to_datetime(df['result_date'], utc=True) # 3. 执行过滤 # 构造要排除的条件,加~取反就是要保留的行 filter_mask = ~((df['proc_date'] == day_before_yday) & (df['result_date'] < yday_1030_cutoff)) df = df[filter_mask]
示例验证
以你给出的示例数据为例,假设当前UTC时间为2021-09-07,那么昨日为2021-09-06,昨日的前一天为2021-09-05,过滤后剩余行如下:
index | proc_date | result_date 2 2021-09-05 2021-09-06 10:31:00 3 2021-09-06 2021-09-06 10:00:00 4 2021-09-06 2021-09-06 12:00:00
完全符合预期要求。
注意事项
- 如果你的
result_date已经是带UTC时区的datetime类型,不需要重复加utc=True参数 - 如果你的
proc_date本身存储的就是date类型,不需要执行dt.date转换
内容的提问来源于stack exchange,提问作者lazycamper
相关产品推荐
相关产品推荐

