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

Pandas Datetime转Postgres Date类型及to_sql日期格式报错解决问询

Pandas datetime类型写入Postgres Date字段报错解决方案

报错根因

你的stat_date、feed_date字段在Pandas中为datetime64[ns]类型(可能携带时区信息),但Postgres目标表对应字段为date类型,psycopg2驱动无法自动完成格式适配,触发非法日期格式报错。

解决方案

方案1:转换为Python原生date对象(最稳定)

psycopg2原生支持Python date类型和Postgres date类型的适配,无需额外配置,修改后的代码如下:

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

tz = pytz.timezone('America/Chicago')

# feed_id转datetime后提取纯日期对象,NaT会自动转为None对应Postgres NULL
df.insert(1, 'feed_date', pd.to_datetime(df['feed_id'], errors='coerce').dt.date)
# 先计算昨日时区时间再提取date,避免跨时区日期计算错误
df.insert(1, 'stat_date', (datetime.now(tz) - timedelta(days=1)).date())

df.to_sql("table", engine, if_exists='append', index=False, schema="stats")

方案2:通过dtype指定字段类型

如果需要保留Pandas datetime类型,可在to_sql时通过dtype参数显式指定对应字段为Postgres DATE类型:

from sqlalchemy.types import DATE

# 前面字段处理逻辑不变,to_sql时新增dtype参数
df.to_sql(
    "table", 
    engine, 
    if_exists='append', 
    index=False, 
    schema="stats",
    dtype={
        "feed_date": DATE,
        "stat_date": DATE
    }
)

注意事项

  • 不要在纯date对象外层套pd.to_datetime,会将其转回带时间的datetime64类型,提升转换出错概率
  • 带时区的日期计算需先做时间偏移再提取日期,避免跨日边界时日期计算错误
  • pd.to_datetime转换生成的NaT值调用.dt.date后会转为None,写入Postgres时会自动映射为NULL,符合业务预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:36:05