Как настроить метод Pandas to_sql, чтобы мои данные были отформатированы с правильным номером. десятичных дробей?

Есть таблица Oracle, которую мне нужно заполнить данными о погоде. Вот как выглядит таблица:

"IDGRID" NUMBER(12,0) NOT NULL,
"DAY" DATE CONSTRAINT NOT NULL,
"TEMPERATURE_MAX" NUMBER(3,1) NOT NULL,
"TEMPERATURE_MIN" NUMBER(3,1) NOT NULL,
"TEMPERATURE_AVG" NUMBER(3,1) NOT NULL,
"TEMPERATURE_DEW" NUMBER(3,1) NOT NULL,
"VAPOURPRESSURE" NUMBER(4,2) NOT NULL,
"WINDSPEED" NUMBER(5,1) NOT NULL,
"PRECIPITATION" NUMBER(4,1) NOT NULL,
"RADIATION" NUMBER(6,0) NOT NULL,
"SNOWDEPTH" NUMBER(6,0), 
"SNOWWEQ" NUMBER(6,2), 
"CLOUDCOVER" NUMBER(4,3) NOT NULL 

Я разрабатываю код Python для выполнения этой задачи. У меня есть данные в фрейме данных Pandas df2, где все столбцы имеют то же имя, что и поля таблицы. Чтобы обеспечить правильную точность, я добавил этот оператор, прежде чем вызывать метод pandas «to_sql»:

df2 = df2.round({"TEMPERATURE_MAX": 1, "TEMPERATURE_MIN": 1, "TEMPERATURE_AVG": 1, 
    "TEMPERATURE_DEW": 1, "VAPOURPRESSURE": 2, "WINDSPEED": 1, "PRECIPITATION": 1, 
    "RADIATION": 0, "SNOWDEPTH": 0, "SNOWWEQ": 2, "CLOUDCOVER": 3}
)
df2.to_sql(name='MY_WEATHER_TABLE', con=engine, chunksize=1000, if_exists='append')

К вашему сведению: я использую механизм sqlalchemy для подключения к базе данных Oracle. К сожалению, кажется, что округление данных не дает ожидаемого результата. Мой вопрос: что я могу сделать в своем коде Python, чтобы решить эту проблему?

Исключение: (cx_Oracle.DatabaseError) ORA-01438: значение больше указанной точности, допустимой для этого столбца. [SQL: ВСТАВИТЬ В "ПОГОДА_ERA5_GRID_TEST" ("IDGRID", "ДАВЛЕНИЕ ПАР", "TEMPERATURE_AVG", "TEMPERATURE_DEW", "TEMPERATURE_MAX", "TEMPERATURE_MIN", "ОБЛАЧНОСТЬ", "SNOWWEQ", "СНЕЖНАЯ ГЛУБИНА", "ОСАДКИ", " РАДИАЦИЯ", "СКОРОСТЬ ВЕТРА", "ДЕНЬ") ЗНАЧЕНИЯ (:IDGRID, :VAPOURPRESSURE, :TEMPERATURE_AVG, :TEMPERATURE_DEW, :TEMPERATURE_MAX, :TEMPERATURE_MIN, :CLOUDCOVER, :SNOWWEQ, :SNOWDEPTH, :ОСАДКИ, :РАДИАЦИЯ, :WEINDSPEED, : ДЕНЬ)] [Параметры: [{ 'IDGRID': 904491077, 'VAPOURPRESSURE': +11,729999542236328, 'TEMPERATURE_AVG': -17,899999618530273, 'TEMPERATURE_DEW': -20,700000762939453, 'TEMPERATURE_MAX': -17,799999237060547, 'TEMPERATURE_MIN': -25,100000381469727, 'CLOUDCOVER': 0,9700000286102295 , 'SNOWWEQ': 8.399999618530273, 'SNOWDEPTH': 55.0, 'ОСАДКИ': 1.399999976158142, 'РАДИАЦИЯ': 379.0, 'СКОРОСТЬ ВЕТРА': 4.599999904632568, 'ДЕНЬ': datetime(20, 20, и т. д.): datetime(20, 20, 20):

Проверьте документ cx_Oracle о точности чисел cx-oracle.readthedocs.io/en/latest/user_guide/….

Christopher Jones 29.03.2022 23:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказалось, что в моем коде для расчета давления пара была ошибка, что привело к значениям больше 99,99, и они не помещались в столбец, определенный как ЧИСЛО (4,2). Сообщение об ошибке от Oracle оттолкнуло меня из-за использованного в нем слова «точность». Таким образом, большое количество десятичных знаков, используемых в операторе INSERT, на самом деле не вызывало проблемы. Это означает, что не нужно было преобразовывать какой-либо столбец фрейма данных в десятичный тип. Решение состояло в том, чтобы исправить ошибку в расчете. В любом случае спасибо, Кристофер Джонс!

Другие вопросы по теме