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

Python使用write_pandas向Snowflake插入日期数据时类型转换报错

Python DataFrame datetime.date 写入Snowflake DATE列报错解决

问题场景

  • Python中DataFrame(temp_df)的Month列数据类型为datetime.date,数据示例:
    [datetime.date(2020, 1, 31), datetime.date(2020, 2, 29),
     datetime.date(2020, 3, 31), datetime.date(2020, 4, 30),
     datetime.date(2020, 5, 31), ...]
    
  • Snowflake中创建的DummyTable表,Month列类型为DATE,建表语句片段:
    ctx.cursor().execute(
    "CREATE or REPLACE TABLE DummyTable "
    "(\"Company Name\" varchar(255), \"Month\" Date, ..."
    
  • 使用write_pandas插入数据的代码:
    success, nchunks, nrows, _ = write_pandas(conn=ctx, df=temp, table_name='DummyTable'.upper(), schema=STAGING_SCHEMA.upper(), database=STAGING_DB.upper())  
    
  • 执行时报错:

    100071 (22000): Failed to cast variant value "2023-04-30" to REAL

解决方案

这个错误是因为write_pandas自动推断列类型时出错,把日期误识别为数值类型导致转换失败,可通过以下方式解决:

  1. 显式指定列类型映射
    调用write_pandas时,用dtype参数明确指定Month列对应Snowflake的DATE类型,避免自动推断错误:

    # 定义类型映射
    dtype_mapping = {
        'Month': 'DATE'
    }
    
    success, nchunks, nrows, _ = write_pandas(
        conn=ctx,
        df=temp,
        table_name='DummyTable'.upper(),
        schema=STAGING_SCHEMA.upper(),
        database=STAGING_DB.upper(),
        dtype=dtype_mapping
    )
    
  2. 转换日期列为字符串格式
    把datetime.date类型的列转为YYYY-MM-DD格式的字符串,Snowflake会自动将符合格式的字符串转为DATE类型:

    temp['Month'] = temp['Month'].astype(str)
    # 再执行原write_pandas插入代码
    
  3. 排查异常值
    确认Month列中没有非日期格式的异常值(比如数值、格式错误的字符串),可通过以下代码检查:

    import datetime
    # 筛选出非datetime.date类型的行
    invalid_rows = temp[~temp['Month'].apply(lambda x: isinstance(x, datetime.date))]
    print(invalid_rows)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:25:20