为何SQL Server的date类型导入Parquet后变为datetime64[ns]?
SQL Server Date类型导出Parquet后读取类型转换问题解决
技术解决方案
方案1:读取后手动转回纯日期类型
若已知原SQL Server的date列名称,读取后直接对目标列做类型转换,还原为纯日期类型:
df = pd.read_parquet(r"path\to\file.parquet", engine='fastparquet') # 假设目标列名为`order_date`,转换为pandas纯日期类型(datetime64[D]) df['order_date'] = df['order_date'].astype('datetime64[D]') # 或转换为Python原生date对象 df['order_date'] = df['order_date'].dt.date
方案2:读取时禁用自动日期转换
利用fastparquet的convert_dates参数,关闭自动日期解析,后续手动转换为date类型:
# 关闭自动日期转换,date列会以字符串形式读取 df = pd.read_parquet(r"path\to\file.parquet", engine='fastparquet', convert_dates=False) # 将字符串列转换为纯日期类型 df['order_date'] = pd.to_datetime(df['order_date']).dt.date
方案3:切换至pyarrow引擎读取
pyarrow对Parquet日期类型的映射更贴合源类型,默认读取后可直接转换为纯日期类型:
df = pd.read_parquet(r"path\to\file.parquet", engine='pyarrow') # 转换为纯日期类型 df['order_date'] = df['order_date'].astype('datetime64[D]')
给质检团队的回复说明
关于SQL Server date类型导出Parquet后读取显示为datetime的问题:
- 原因:Parquet文件的date类型在fastparquet引擎默认解析规则下,会被映射为datetime64[ns]类型,但仅保留日期部分(时间为00:00:00),实际日期值与源数据完全一致,无偏差。
- 处理措施:我们已针对原date类型的列,通过读取后转换的方式还原为纯日期类型;后续会调整读取参数或切换引擎,从根源避免自动类型转换。
- 影响说明:当前转换后的列仅类型标识为datetime,但存储的日期数据准确,不会影响业务分析、报表生成等任何数据使用场景。
内容的提问来源于stack exchange,提问作者Stack_mobile2
相关产品推荐
相关产品推荐

