Python导入Teradata日期报错:空日期列及日期格式不兼容问题咨询
解决方案
问题1:3个空日期列需为空上传的实现方法
报错根源是空值类型不匹配,按以下步骤调整即可:
- 创建空日期列时不要使用空字符串
""或直接传入None,要明确指定列为datetime类型,空值用pandas原生的NaT(对应SQL的日期NULL值),创建代码如下:import pandas as pd # 插入空日期列时直接指定dtype为datetime,生成的空值就是标准NaT格式 df.insert(5, "ACTIVE_DATE", pd.Series(dtype='datetime64[ns]')) - 若已经生成了object类型的空日期列,先统一做类型转换,把所有非法值转为
NaT:# 对3个空日期列都执行该操作 df['ACTIVE_DATE'] = pd.to_datetime(df['ACTIVE_DATE'], errors='coerce') - 调用
to_sql时添加dtype参数,明确告知sqlalchemy这几列是日期类型,避免驱动自动推断类型出错:from sqlalchemy.types import DATE eng = sqlalchemy.create_engine('teradatasql://user:pass@host') df.to_sql( name='Sales_DB', con=eng, if_exists='append', index=False, schema='sales', # 此处把3个空日期列都加上类型声明 dtype={ "ACTIVE_DATE": DATE(), "你的第二列空日期名称": DATE(), "你的第三列空日期名称": DATE() } )
问题2:DD/MM/YYYY格式Python导入失效的原因
其他非Python的导入工具(比如Teradata自带的FastLoad、BTEQ等)会自动读取当前Teradata实例的会话日期格式配置,多数业务场景下Teradata默认会话格式为DD/MM/YYYY,因此可以直接识别该格式的日期值。
而Python的teradatasql驱动搭配pandas的to_sql方法时,默认遵循ISO日期序列化标准,仅识别YYYY-MM-DD格式的日期值,不会主动适配Teradata实例的本地日期格式配置,因此直接传入DD/MM/YYYY格式的字符串会被判定为非法日期。
内容的提问来源于stack exchange,提问作者JohnR
相关产品推荐
相关产品推荐

