Pandas to_datetime日期对比失效与DataFrame查询空结果问题
Pandas日期对比异常及DataFrame日期筛选问题
问题场景
在筛选DataFrame中InvoiceDate列为2011-06-22的所有行时,使用语句sales_data[sales_data["InvoiceDate"].dt.date == "2011-06-22"]返回空DataFrame,不符合预期。为排查问题,做了如下实验:
import pandas as pd d1 = "2009-12-01 07:45:00" d2 = "2009-12-01 08:20" d1 = pd.to_datetime(d1) d2 = pd.to_datetime(d2) print(d1 == d2) print(d1.year == d2.year) print(d1.month == d2.month) print(d1.day == d2.day) print(d1.date == d2.date)
实验结果显示,除最后一行d1.date == d2.date返回False外,其余对比结果均正确。疑问:为何其他日期属性对比正常,唯独date属性对比返回False?
原因分析
d1.date和d2.date是对Python内置datetime.date对象属性的引用,而非调用方法后得到的日期值。这里实际在比较两个对象的date属性的内存地址,而非它们对应的日期内容,所以返回False。
正确的对比方式是调用date()方法,即d1.date() == d2.date(),此时会对比两个日期对象的实际值,结果为True。
解决DataFrame筛选问题
针对最初的筛选需求,有两种可行的修改方式:
方法1:调用dt.date()方法对比
# 对比date对象 sales_data[sales_data["InvoiceDate"].dt.date() == pd.to_datetime("2011-06-22").date()] # 或转为字符串对比(需确保格式一致) sales_data[sales_data["InvoiceDate"].dt.strftime("%Y-%m-%d") == "2011-06-22"]
方法2:使用日期范围筛选(更高效)
利用Pandas的datetime特性直接筛选范围,避免提取日期部分,执行效率更高:
start = "2011-06-22" end = "2011-06-23" sales_data[sales_data["InvoiceDate"].between(start, end, inclusive="left")]
内容的提问来源于stack exchange,提问作者MJROCKS
相关产品推荐
相关产品推荐

