Pandas中datetime作为isin条件返回False的问题排查
解决pandas日期筛选始终返回False及「bound method Timestamp.date」类型问题
问题场景
用pandas读取测量数据,df['Record Date']是datetime64[ns]类型,需要筛选出日期在plate.date(Plate类的日期列表属性)中的数据,但执行df["Record Date"].dt.date.isin(plate.date)时条件始终返回False,还出现「bound method Timestamp.date of Timestamp」的类型提示。背景是Plate类用于存储不同日期的孔位样本信息,仅需保留列表内日期的数据并添加样本属性。
问题根源
- Plate类日期属性赋值错误:初始化Plate时,直接把
date.date赋值给了属性,没有加括号调用date.date()方法,导致plate.date列表里存的是绑定方法对象,而非实际的datetime.date日期对象。 - 类型不匹配:pandas的
df["Record Date"].dt.date返回的是datetime.date对象序列,和plate.date里的方法对象完全不匹配,所以isin()永远无法匹配成功。
修复步骤
1. 修正Plate类的日期属性赋值
把Plate类中对date属性的赋值逻辑,从直接引用方法改成调用方法获取日期对象:
class Plate: def __init__(self, date_list): # 遍历日期列表,调用date()方法得到datetime.date对象 self.date = [single_date.date() for single_date in date_list]
2. 验证两侧数据类型一致性
确认plate.date和pandas侧的日期类型一致:
# 检查plate.date中元素的类型 print(type(plate.date[0])) # 应该输出 <class 'datetime.date'> # 检查pandas侧日期元素的类型 print(type(df["Record Date"].dt.date.iloc[0])) # 同样输出 <class 'datetime.date'>
3. 重新执行筛选逻辑
类型匹配后,筛选条件即可正常生效:
if hasattr(plate, 'date'): condition = df["Record Date"].dt.date.isin(plate.date) filtered_df = df[condition] # 后续处理筛选后的filtered_df
补充说明
对比可正常运行的代码relevant_df=df[df["Record Date"].dt.date.isin(dates_to_keep)],核心就是dates_to_keep是datetime.date对象列表,只要保证plate.date也是同类型列表,就能解决匹配失败的问题。
内容的提问来源于stack exchange,提问作者ACCakut
相关产品推荐
相关产品推荐

