Я работаю над проектом, в котором у нас есть сторонние документы Excel, которые нужно загрузить на SQL Сервер. Некоторые из столбцов содержат смесь строковых и плавающих типов данных.
При использовании pandas .read_excel () для загрузки данных в фрейм данных, за которым следует pandas .to_ sql () для загрузки на сервер SQL, точность с плавающей запятой округляется до ближайшего десятого знака после запятой.
Я читаю документацию pandas и не вижу любые аргументы, которые могут быть переданы для поддержания точности с плавающей точкой.
Я также пытался сделать то же самое с pandas .read_csv () , за которым следует pandas .to_ sql () с использованием тех же данных. , и точность поплавка сохраняется! Проблема в том, что мне выдаются файлы Excel, содержащие форматирование, несколько листов и т. Д. c. и не можете управлять этим.
Вы можете заново создать проблему с помощью следующего:
Файл Excel (.xls) с одним столбцом и следующими данными:
Document Summary
All
Total Sales
1479.9
39002.33
11295.76
Python 3 файла (stop_rounding.py):
import pandas as pd
import sqlalchemy
db_user = "user"
db_pass = "pass"
server = "server_name"
db = "database"
sql_engine = sqlalchemy.create_engine(
f"mssql+pyodbc://{db_user}:{db_pass}@{server}/{db}"
"?driver=ODBC+Driver+17+for+SQL+Server"
)
# single column Excel file containing mixed string and float data types
file_path = (
r"doc_summary.xls"
)
df = pd.read_excel(io=file_path, sheet_name=0, header=None)
# check our values once loaded into pandas dataframe
print(df[0].values)
# prints ['Document Summary' 'All' 'Total Sales' 1479.9 39002.32999999997 11295.76000000001]
table_name = "stopRounding"
# load dataframe into sql table
df.to_sql(table_name, sql_engine, if_exists="replace")
# !! this is where floating point values above are being rounded
# retrieve data from table created from dataframe
sql_val = pd.read_sql(f"SELECT * FROM {table_name}", sql_engine)
print(sql_val.values)
# prints [[0 'Document Summary']
# [1 'All']
# [2 'Total Sales']
# [3 '1479.9']
# [4 '39002.3']
# [5 '11295.8']]