Pandas中使用query方法传递datetime64类型时如何避免FutureWarning
解决Pandas query方法中datetime64[ns]类型的FutureWarning问题
问题背景
谷歌Colab更新后,使用Pandas的query方法操作datetime64[ns]类型字段时,若直接用字符串匹配会触发以下FutureWarning:
The behavior of 'isin' with dtype=datetime64[ns] and castable values (e.g. strings) is deprecated. In a future version, these will not be considered matching by isin. Explicitly cast to the appropriate dtype before calling isin instead.
示例数据:
import numpy as np import pandas as pd df = pd.DataFrame({'some_dates' :[pd.Timestamp('2024-09-30 00:00:00'), pd.Timestamp('2024-09-23 00:00:00')]})
通过df.dtypes可确认字段类型为datetime64[ns]。
可行解决方案
方案1:在query中用@pd.Timestamp()传递匹配日期
直接在query表达式中通过@符号调用pd.Timestamp生成匹配的datetime对象,彻底避免隐式类型转换:
# 无警告且执行正常 result = df.query("some_dates in [@pd.Timestamp('2024-09-30 00:00:00')]") print(result)
方案2:提前定义datetime变量再引用
如果需要匹配多个日期或追求代码可读性,可先定义目标日期变量,再用@在query中引用:
# 匹配单个日期 target_date = pd.Timestamp('2024-09-30') result = df.query("some_dates == @target_date") # 匹配多个日期 target_dates = [pd.Timestamp('2024-09-30'), pd.Timestamp('2024-09-23')] result = df.query("some_dates in @target_dates")
为什么其他方法不可行
- 直接用字符串匹配:
df.query("some_dates in ['2024-09-30']")会触发警告,因为Pandas将废弃字符串到datetime的隐式转换逻辑,未来版本将不再支持这种匹配方式。 - 直接在query中用
np.datetime64:df.query("some_dates in [np.datetime64('2024-09-30')]")会报UndefinedVariableError(query默认不识别全局的np模块);加@后df.query("some_dates in [@np.datetime64('2024-09-30')]")又会触发TypeError,因为numpy的datetime类型在query上下文里和Pandas的datetime64[ns]存在兼容性问题。
内容的提问来源于stack exchange,提问作者arnaud leclair
相关产品推荐
相关产品推荐

