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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:31:05