如何让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
相关产品推荐
相关产品推荐

