赋值pandas DataFrame列首值给变量后,判断存在性返回False的问题
这个问题我太熟悉了——我之前也踩过这个类型不匹配的坑!你猜的没错,核心原因就是不同时间对象类型之间的直接比较,并不会自动识别它们代表的是同一个时间点,而是先检查类型是否一致,不一致就直接返回False。
为什么会返回False?
举个你大概率遇到的场景:假设你的代码里用到了pandas的Timestamp、numpy的datetime64和Python原生的datetime.datetime对象,比如这样:
import pandas as pd from datetime import datetime # Python原生datetime对象 py_dt = datetime(2024, 5, 20) # pandas Timestamp对象 pd_ts = pd.Timestamp(py_dt) # 转成numpy datetime64对象 numpy_dt = pd_ts.to_numpy() # 直接比较numpy datetime64和Python datetime print(numpy_dt == py_dt) # 这里会返回False!
这里numpy_dt是numpy.datetime64类型,py_dt是datetime.datetime类型,Python的==运算符在跨类型比较这类对象时,不会自动转换类型去匹配时间值,而是因为类型不同直接返回False。
如果是带时区的时间对象,这个问题会更常见——比如带时区的Timestamp和无时区的原生datetime比较,也会直接返回False。
如何让判断返回True?
解决思路很简单:把两边的时间对象转换成同一类型,再做比较。这里给你几个实用的方法:
方法1:把numpy datetime64转成Python原生datetime
可以借助pandas的Timestamp来转换,或者用numpy自身的方法:# 用pandas转换 print(pd.Timestamp(numpy_dt).to_pydatetime() == py_dt) # 返回True # 用numpy转换 print(numpy_dt.astype('datetime64[ns]').tolist() == py_dt) # 返回True方法2:把Python原生datetime转成numpy datetime64
反过来转换也能解决问题:import numpy as np print(numpy_dt == np.datetime64(py_dt)) # 返回True方法3:如果是pandas Timestamp和原生datetime直接比较
大部分情况下pd_ts == py_dt会返回True,但如果涉及时区不一致,需要先统一时区:# 比如Timestamp带时区,转成无时区再比较 print(pd_ts.tz_localize(None) == py_dt) # 返回True
额外提醒
如果你的判断是在pandas的DataFrame/Series里做批量比较,建议用pandas自带的方法(比如df['date'].eq(py_dt)),它会自动处理类型转换,避免手动转换的麻烦。
内容的提问来源于stack exchange,提问作者KOB

