Pandas时间类型不匹配报错:带时区datetime64与datetime无法比较
解决Pandas带时区日期与普通日期的比较错误
问题原因
报错信息明确指出:TypeError: Invalid comparison between dtype=datetime64[ns, UTC-03:00] and datetime,说明df['delivered_at']列是带UTC-03:00时区的datetime类型,而用来比较的last_update是无时区的原生datetime对象,Pandas不允许这种跨时区的直接日期比较。
两种解决方案
方案1:将last_update转换为与delivered_at同时区的datetime对象
这是更严谨的做法,适合需要保留时区信息的业务场景:
import pandas as pd # 情况1:如果last_update是字符串格式 last_update = pd.to_datetime(last_update).tz_localize('UTC').tz_convert('UTC-03:00') # 情况2:如果last_update已经是Python datetime对象 last_update = pd.to_datetime(last_update).tz_localize(None).tz_localize('UTC-03:00')
方案2:移除delivered_at列的时区信息
如果业务逻辑允许忽略时区差异,可以直接去掉列的时区:
df['delivered_at'] = df['delivered_at'].dt.tz_localize(None)
优化后的完整代码
以方案1为例,同时优化多条件判断的写法(用isin替代多个==):
import pandas as pd # 统一last_update的时区为UTC-03:00 last_update = pd.to_datetime(last_update).tz_localize('UTC').tz_convert('UTC-03:00') # 筛选符合条件的数据 df_delivered = df.loc[(df['state'].isin([2, 4, 7])) | (df['direction'] == 1) | (df['delivered_at'] > last_update)] df_delivered['Delivered'] = 1 # 合并并清理数据 df1 = df.merge(df_delivered, left_index=True, right_index=True, how='outer', suffixes=('', '_y')) df1.drop(df1.filter(regex='_y$').columns, axis=1, inplace=True) df = df1
内容的提问来源于stack exchange,提问作者Gabrielle Almeida Mourão
相关产品推荐
相关产品推荐

