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

如何让T-SQL将导入的NaT datetime识别为NULL而非零日期?

解决pandas NaT通过fast_to_sql导入SQL Server时转为NULL而非零日期的问题

fast_to_sql默认会将pandas的NaT映射为SQL Server的最小日期值0001-01-01 00:00:00.0000000,要实现自动转为NULL,可以通过以下两种方式处理:

方法一:预处理DataFrame,将NaT替换为None

pandas中的None在导出到SQL时会被识别为数据库的NULL值,因此在导入前对日期列做替换处理:

dataframe['date'] = dataframe['date'].where(dataframe['date'].notna(), None)

方法二:使用fast_to_sql的replace_NaT参数(部分版本支持)

如果你的fast_to_sql版本支持replace_NaT参数,直接设置该参数为True即可自动将NaT转为NULL:

create_statement = fts.fast_to_sql(df=dataframe,
                                  name="test",
                                  conn=conn,
                                  if_exists="replace",
                                  temp=False,
                                  replace_NaT=True)

完整修改后的代码示例

import pandas as pd
import numpy as np
import pyodbc
import fast_to_sql as fts

# 构造包含NaT的DataFrame
dataframe = pd.DataFrame({'date': pd.Series(["2022-01-01 00:00:00", np.datetime64('NaT')], dtype='datetime64[ns]')})

# 预处理替换NaT为None
dataframe['date'] = dataframe['date'].where(dataframe['date'].notna(), None)

# 数据库连接配置
driver = 'ODBC Driver 17 for SQL Server'
server = 'desktop-curtnl0\\sqlexpress'
Trusted_Connection = 'yes'
username = ''
password = ''
database_name = '你的数据库名称'  # 替换为实际数据库名

# 构建连接字符串
connection = f'driver={{{driver}}};server={server};database={database_name};Trusted_Connection={Trusted_Connection};uid={username};pwd={password}'

# 建立连接并导入数据
conn = pyodbc.connect(connection)
create_statement = fts.fast_to_sql(df=dataframe,
                                  name="test",
                                  conn=conn,
                                  if_exists="replace",
                                  temp=False)
conn.commit()
conn.close()

执行以上代码后,在SSMS中查看test表,原DataFrame中的NaT值会被正确存储为NULL,而非零日期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:45:42