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

DataFrame时区时间比较报错:datetime64[ns, UTC]与datetime无法比较

解决带UTC时区的时间范围筛选问题

问题根源

你遇到的TypeError核心原因是pandas带时区的时间戳(datetime64[ns, UTC])无法和无时区的Python原生datetime对象直接比较,两边必须保持时区一致性。另外你的代码存在列名不匹配问题:DataFrame实际列名为result_video_upload_time,但筛选时误用了df['date'],这会导致列不存在的错误。

解决方案1:给原生datetime对象添加UTC时区

直接给时间范围的起止时间加上UTC时区标记,让它们和DataFrame中的时间戳时区完全匹配:

import pandas as pd
from datetime import datetime, timedelta, timezone

# 初始化数据并修正列名
dfori = [
    {'id': '1','time': '2023-05-06T23:00:02Z'},
    {'id': '2','time': '2023-05-05T00:00:23Z'},
    {'id': '3','time': '2023-05-04T00:00:30Z'}]

df = pd.DataFrame(dfori).rename(columns={'time': 'result_video_upload_time'})
# 将字符串解析为带UTC时区的pandas时间戳
df['result_video_upload_time'] = pd.to_datetime(df['result_video_upload_time'], utc=True)

# 生成带UTC时区的时间范围
utc_now = datetime.now(timezone.utc).replace(microsecond=0)
start_date = utc_now
end_date = utc_now - timedelta(hours=1)

# 筛选最近1小时内的数据
filtered_df = df.loc[
    (df['result_video_upload_time'] > end_date) & 
    (df['result_video_upload_time'] < start_date)
]
print(filtered_df)

解决方案2:将DataFrame的时间戳转为无时区格式

如果不需要保留时区信息,可以把DataFrame中的带时区时间戳转换为无时区格式,这样就能直接和原生无时区datetime对象比较:

import pandas as pd
from datetime import datetime, timedelta

# 初始化数据并修正列名
dfori = [
    {'id': '1','time': '2023-05-06T23:00:02Z'},
    {'id': '2','time': '2023-05-05T00:00:23Z'},
    {'id': '3','time': '2023-05-04T00:00:30Z'}]

df = pd.DataFrame(dfori).rename(columns={'time': 'result_video_upload_time'})
# 解析为带UTC时区的时间戳后移除时区信息
df['result_video_upload_time'] = pd.to_datetime(df['result_video_upload_time'], utc=True).dt.tz_localize(None)

# 生成无时区的UTC时间范围
start_date = datetime.utcnow().replace(microsecond=0)
end_date = start_date - timedelta(hours=1)

# 筛选数据
filtered_df = df.loc[
    (df['result_video_upload_time'] > end_date) & 
    (df['result_video_upload_time'] < start_date)
]
print(filtered_df)

关键注意事项

  • 必须先将字符串格式的时间解析为pandas时间戳:使用pd.to_datetime(..., utc=True)可直接识别带Z标记的UTC时间字符串。
  • 时间范围逻辑要明确:你当前的代码是筛选最近1小时内的数据,若需要调整范围,直接修改timedelta的参数即可。
  • 严格避免混用带时区和无时区时间对象:这是引发类型错误的核心,一定要保证两边时区状态一致。

内容的提问来源于stack exchange,提问作者user21090678

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:30:25