我有一个通过阅读电子邮件附件创建的 Pandas df。当插入 SQL Server 表时,我看到参数 6(即“调用长度”列)出现以下错误:
参数 6 (""):提供的值不是数据类型 float 的有效实例。检查源数据是否存在无效值。无效值的一个示例是小数位数大于精度的数字类型数据。
最初呼叫长度是一种时间增量数据类型,但我尝试转换为浮点数。在SQL Server表中显示为十进制(18,2)并以秒为单位显示
我尝试过这样转换:
df['Call Length'] = df['Call Length'].dt.total_seconds().astype(float).round(2)
print(df['Call Length'].dtype) #float64
从我所看到的来看,没有 null 或空行,只有大约 70 行。
然后我只是重命名列:
df_selected = df_selected.rename(columns={
'From Name': 'FromName',
'From Number': 'FromNumber',
'To Name': 'ToName',
'To Number': 'ToNumber',
'Call Length': 'CallLength',
'Call Start Time': 'CallStartTime',
'Call Direction': 'CallDirection',
})
然后插入表中,这就是我看到错误的地方
insert_nonqueue = f"""
INSERT INTO marketing.Test(FromName, FromNumber, ToName, ToNumber, Result, CallLength,
CallStartTime, CallDirection)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
"""
for index, row in df_selected.iterrows():
cursor.execute(insert_nonqueue, row['FromName'], row['FromNumber'], row['ToName'], row['ToNumber'], row['Result'], row['CallLength'], row['CallStartTime'], row['CallDirection'])
conn.commit()
尝试转换之前的呼叫长度数据帧 col 示例:
0 0 days 00:00:37
1 0 days 00:00:20
2 0 days 00:01:09
3 0 days 00:00:45
4 0 days 00:00:27
Name: Call Length, dtype: timedelta64[ns]
这解决了问题:
df_selected = df_selected.fillna(value=0)
通过这个答案找到了解决方案: https://stackoverflow.com/a/53987910/11578869