如何调整 Pandas 方法 to_sql,以便我的数据格式正确。小数?
How to tweak Pandas method to_sql, so that my data are formatted with right no. of decimals?
有一个 Oracle table,我需要用它来填充天气数据。这是 table 的样子:
"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 中有数据,所有列都与 table 字段同名。为了安排正确的精度,我在调用 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:插入“WEATHER_ERA5_GRID_TEST”(“IDGRID”、“VAPOURPRESSURE”、“TEMPERATURE_AVG”、“TEMPERATURE_DEW”、“TEMPERATURE_MAX”、“ TEMPERATURE_MIN", "CLOUDCOVER", "SNOWWEQ", "SNOWDEPTH", "PRECIPITATION", "RADIATION", "WINDSPEED", "DAY") VALUES (:IDGRID, :VAPOURPRESSURE, :TEMPERATURE_AVG, :TEMPERATURE_DEW, :TEMPERATURE_MAX, :TEMPERATURE_MIN, :CLOUDCOVER, :SNOWWEQ, :SNOWDEPTH, :PRECIPITATION, :RADIATION, :WINDSPEED, :DAY)]
[参数:[{'IDGRID':904491077,'VAPOURPRESSURE':11.729999542236328,'TEMPERATURE_AVG':-17.899999618530273,'TEMPERATURE_DEW':-20.700000762939453,'TEMPERATURE_MAX':-17.7999=9952370 [6 27=]:-25.100000381469727,'CLOUDCOVER':0.9700000286102295,'SNOWWEQ':8.399999618530273,'SNOWDEPTH':55.0,'PRECIPITATION':1.399999976158142,[=72=]33 =]: 4.599999904632568, 'DAY': datetime.date(2020, 1, 1)} 等
我的蒸气压计算代码似乎存在错误,导致值大于 99.99,并且这些值不适合定义为 NUMBER(4,2) 的列。来自 Oracle 的错误消息让我很反感,因为其中使用了精确这个词。因此,INSERT-statement 中使用的大量小数并没有真正导致问题。这意味着没有必要将数据框的任何列转换为十进制类型。解决办法是更正计算中的错误。无论如何,谢谢,Christopher Jones!
有一个 Oracle table,我需要用它来填充天气数据。这是 table 的样子:
"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 中有数据,所有列都与 table 字段同名。为了安排正确的精度,我在调用 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:插入“WEATHER_ERA5_GRID_TEST”(“IDGRID”、“VAPOURPRESSURE”、“TEMPERATURE_AVG”、“TEMPERATURE_DEW”、“TEMPERATURE_MAX”、“ TEMPERATURE_MIN", "CLOUDCOVER", "SNOWWEQ", "SNOWDEPTH", "PRECIPITATION", "RADIATION", "WINDSPEED", "DAY") VALUES (:IDGRID, :VAPOURPRESSURE, :TEMPERATURE_AVG, :TEMPERATURE_DEW, :TEMPERATURE_MAX, :TEMPERATURE_MIN, :CLOUDCOVER, :SNOWWEQ, :SNOWDEPTH, :PRECIPITATION, :RADIATION, :WINDSPEED, :DAY)] [参数:[{'IDGRID':904491077,'VAPOURPRESSURE':11.729999542236328,'TEMPERATURE_AVG':-17.899999618530273,'TEMPERATURE_DEW':-20.700000762939453,'TEMPERATURE_MAX':-17.7999=9952370 [6 27=]:-25.100000381469727,'CLOUDCOVER':0.9700000286102295,'SNOWWEQ':8.399999618530273,'SNOWDEPTH':55.0,'PRECIPITATION':1.399999976158142,[=72=]33 =]: 4.599999904632568, 'DAY': datetime.date(2020, 1, 1)} 等
我的蒸气压计算代码似乎存在错误,导致值大于 99.99,并且这些值不适合定义为 NUMBER(4,2) 的列。来自 Oracle 的错误消息让我很反感,因为其中使用了精确这个词。因此,INSERT-statement 中使用的大量小数并没有真正导致问题。这意味着没有必要将数据框的任何列转换为十进制类型。解决办法是更正计算中的错误。无论如何,谢谢,Christopher Jones!