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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:50:46