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
相关产品推荐
相关产品推荐

