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自动推断列类型时出错,把日期误识别为数值类型导致转换失败,可通过以下方式解决:
显式指定列类型映射
调用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 )转换日期列为字符串格式
把datetime.date类型的列转为YYYY-MM-DD格式的字符串,Snowflake会自动将符合格式的字符串转为DATE类型:temp['Month'] = temp['Month'].astype(str) # 再执行原write_pandas插入代码排查异常值
确认Month列中没有非日期格式的异常值(比如数值、格式错误的字符串),可通过以下代码检查:import datetime # 筛选出非datetime.date类型的行 invalid_rows = temp[~temp['Month'].apply(lambda x: isinstance(x, datetime.date))] print(invalid_rows)
内容的提问来源于stack exchange,提问作者Rui Melo
相关产品推荐
相关产品推荐

