Pandas проблема округления при использовании pd.read_excel (), за которой следует pd.to_ sql () - PullRequest
0 голосов
/ 04 марта 2020

Я работаю над проектом, в котором у нас есть сторонние документы 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']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...