如何检查DataFrame日期列值是否在指定日期列表?代码全False求解
问题分析与解决方案
你遇到的全返回False的问题,大概率是日期数据类型不匹配导致的,这是用pandas处理日期时非常容易踩的坑!下面我来拆解原因和对应的解决办法:
核心原因:类型不匹配
你的__DATELIST里是datetime.date对象(比如date(2017,7,4)),但DataFrame的date列大概率是pandas的Timestamp类型(也就是datetime64[ns]格式)。这两种类型哪怕日期数值完全一致,用in判断时也会返回False——因为它们是不同的对象类型,Python会认为它们不相等。
你可以先验证这个问题:
# 打印DataFrame日期列的类型 print(df['date'].dtype) # 打印列表中第一个元素的类型 print(type(__DATELIST[0]))
如果输出分别是datetime64[ns]和<class 'datetime.date'>,那这个就是问题根源。
解决方案:统一类型 + 用pandas原生方法替代apply
方法1:把日期列表转成pandas Timestamp类型
直接用pd.to_datetime把列表转换成和DataFrame列一致的类型,然后用isin方法(比apply高效得多,尤其是大数据量场景):
import pandas as pd # 转换日期列表类型 __DATELIST = pd.to_datetime(__DATELIST) # 直接生成标记列 df['isholiday'] = df['date'].isin(__DATELIST)
方法2:把DataFrame的日期列转成datetime.date类型
如果更习惯用原生date对象,也可以把DataFrame的日期列转成date类型:
# 把Timestamp转成date对象 df['date'] = df['date'].dt.date # 再用isin判断 df['isholiday'] = df['date'].isin(__DATELIST)
额外提醒:为什么apply不行?
你用apply的方式,本质是把每个Timestamp对象和date对象做相等判断,而Python中不同类型的对象默认是不相等的,哪怕它们代表的日期一样。比如:
from datetime import date import pandas as pd ts = pd.Timestamp(2017,7,4) d = date(2017,7,4) print(ts == d) # 输出False!
这就是你的代码全返回False的直接原因。而isin方法在类型兼容的情况下会自动处理数值匹配,比手动写apply更可靠也更高效。
内容的提问来源于stack exchange,提问作者EFaden
相关产品推荐
相关产品推荐

