【问题标题】:“Insert Into” statement causing errors due to “Parameter 39 (”“): The supplied value is not a valid instance of data type float.” [duplicate]“插入到”语句由于“参数 39 (”“) 导致错误:提供的值不是数据类型浮点数的有效实例。” [复制]
【发布时间】:2021-07-10 12:00:29
【问题描述】:

我正在尝试使用 Python 和 Pandas 将几个 .csv 文件加载到 SQL Server 数据库。

当我运行我的代码时,我得到了这个错误:

参数 39 (”“): 提供的值不是浮点数据类型的有效实例。”

我没有 39 个参数...

我将不胜感激!

import pandas as pd

# Import CSV
data = pd.read_csv (r'D:\USA-Data\USA\2007\ORATS_SMV_Strikes_20070103.csv')   
df = pd.DataFrame(data, columns= ['ticker','stkPx','expirDate','yte','strike','cVolu','cOi','pVolu','pOi','cBidPx','cValue','cAskPx','pBidPx','pValue','pAskPx','cBidIv','cMidIv','cAskIv','smoothSmvVol','pBidIv','pMidIv','pAskIv','iRate','divRate','residualRateData','delta','gamma','theta','vega','rho','phi','driftlessTheta','extVol','extCTheo','extPTheo','spot_px','trade_date'])

print(df)

# Connect to SQL Server
import pyodbc

conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=WIN7-PC;'
                      'Database=USA;'
                      'Trusted_Connection=yes;')
cursor = conn.cursor()


# Insert DataFrame to Table
for row in df.itertuples():
    cursor.execute('''INSERT INTO USA.dbo.USAData([ticker,stkPx,expirDate,yte,strike,cVolu,cOi,pVolu,pOi,cBidPx,cValue,cAskPx,pBidPx,pValue,pAskPx,cBidIv,cMidIv,cAskIv,smoothSmvVol,pBidIv,pMidIv,pAskIv,iRate,divRate,residualRateData,delta,gamma,theta,vega,rho,phi,driftlessTheta,extVol,extCTheo,extPTheo,spot_px,trade_date])VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
                row.ticker, 
                row.stkPx,
                row.expirDate,
                row.yte, 
                row.strike,
                row.cVolu, 
                row.cOi,
                row.pVolu,
                row.pOi, 
                row.cBidPx,
                row.cValue, 
                row.cAskPx,
                row.pBidPx,
                row.pValue, 
                row.pAskPx,
                row.cBidIv, 
                row.cMidIv,
                row.cAskIv,
                row.smoothSmvVol, 
                row.pBidIv,
                row.pMidIv, 
                row.pAskIv,
                row.iRate,
                row.divRate, 
                row.residualRateData,
                row.delta, 
                row.gamma,
                row.theta,
                row.vega, 
                row.rho,
                row.phi,
                row.driftlessTheta, 
                row.extVol,
                row.extCTheo,
                row.extPTheo, 
                row.spot_px,
                row.trade_date
                )
conn.commit()

【问题讨论】:

  • re: "我没有 39 个参数" – SQL Server 使用 sp_prepexec 执行查询,这需要三 (3) 个额外参数,因此查询的第一个参数实际上是sp_prepexec 的第四个参数。因此“参数 39”实际上是指查询的第 36 个参数,即spot_px。您的 DataFrame 在该列中至少包含一个值,该值被映射到一个空字符串,并且 SQL Server 拒绝自动将其转换为浮点数。
  • 为了更好地组织和维护,您应该避免重复大量的列名。将它们分配/重新排序一次,并使用DataFrame.columns 及其 qmarks 的长度创建准备好的 SQL 语句。如果这些长列表之一减一,则整个查询可能会失败。另外,由于您的错误涉及数据类型,请发布df.dtypes
  • @GordThompson 谢谢你的帮助,一定要让我走上正确的道路来解决这个问题。如何让 sql 接受空单元格/字符串?
  • 不可能,float 数字应该是什么空字符串?

标签: python sql-server pandas sql-insert pyodbc


【解决方案1】:

我之前遇到过这个问题,这个错误的可能原因可能是数据框中的 NaN 值,建议打印 df 并检查是否有任何 NaN 值并采取相应措施来更正数据。

【讨论】:

  • 所有数据都是正确的,我没有任何 null 或 nan 值
  • 为了调试,在循环中打印出所有row.(实际上应该是row['...'])值,然后在出现错误时查看值。
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 2018-04-04
  • 2019-01-04
  • 1970-01-01
相关资源
最近更新 更多