Pandas 错误地推断出 cx_oracle 游标数据类型
Pandas incorrectly infers cx_oracle cursor datatype
我必须从 oracle 数据库中获取数据。
pandas.read_sql
太慢了,所以我转而使用 cx_oracle 游标。
以下代码正确检索了数据和列名,不幸的是推断的数据类型是错误的(对于数字)。
import pandas as pd
import cx_oracle as cx
import sqlalchemy as sa
conn = engine.raw_connection()
cursor = conn.cursor()
cursor.prefetchrows = 1000
cursor.arraysize = 100000
df = pd.DataFrame(cursor.execute(sqlQuery).fetchall(),
columns = [row[0] for row in cursor.description])
我知道数据类型存储在 cursor.description
中,但我不确定如何从那里正确检索它。
以下不能直接用于声明 pandas 中的列数据类型:
dtype = [row[1] for row in cursor.description]
输出如下所示:
[<cx_Oracle.DbType DB_TYPE_VARCHAR>,
<cx_Oracle.DbType DB_TYPE_NUMBER>,
<cx_Oracle.DbType DB_TYPE_VARCHAR>,
<cx_Oracle.DbType DB_TYPE_NUMBER>, # Pandas infers this as object
<cx_Oracle.DbType DB_TYPE_NUMBER>, # Pandas infers this as object
<cx_Oracle.DbType DB_TYPE_DATE>]
那么,如何正确检索列的数据类型?
很明显,我的最终 objective 是简单地从 Oracle 数据库中获取并解析为 pandas 数据框,其中包括列名和正确的数据类型。
欢迎提出更好的方法。
我是这样解决的:
## fetch db dtypes
dtype_db = [row[1] for row in cursor.description]
for idx, default_type in enumerate(dtype_db):
if (default_type == cx_Oracle.DB_TYPE_NUMBER) &
(df[df.columns[idx]].dtype=='object'):
df[df.columns[idx]] = df[df.columns[idx]].astype(float)
我必须从 oracle 数据库中获取数据。
pandas.read_sql
太慢了,所以我转而使用 cx_oracle 游标。
以下代码正确检索了数据和列名,不幸的是推断的数据类型是错误的(对于数字)。
import pandas as pd
import cx_oracle as cx
import sqlalchemy as sa
conn = engine.raw_connection()
cursor = conn.cursor()
cursor.prefetchrows = 1000
cursor.arraysize = 100000
df = pd.DataFrame(cursor.execute(sqlQuery).fetchall(),
columns = [row[0] for row in cursor.description])
我知道数据类型存储在 cursor.description
中,但我不确定如何从那里正确检索它。
以下不能直接用于声明 pandas 中的列数据类型:
dtype = [row[1] for row in cursor.description]
输出如下所示:
[<cx_Oracle.DbType DB_TYPE_VARCHAR>,
<cx_Oracle.DbType DB_TYPE_NUMBER>,
<cx_Oracle.DbType DB_TYPE_VARCHAR>,
<cx_Oracle.DbType DB_TYPE_NUMBER>, # Pandas infers this as object
<cx_Oracle.DbType DB_TYPE_NUMBER>, # Pandas infers this as object
<cx_Oracle.DbType DB_TYPE_DATE>]
那么,如何正确检索列的数据类型?
很明显,我的最终 objective 是简单地从 Oracle 数据库中获取并解析为 pandas 数据框,其中包括列名和正确的数据类型。 欢迎提出更好的方法。
我是这样解决的:
## fetch db dtypes
dtype_db = [row[1] for row in cursor.description]
for idx, default_type in enumerate(dtype_db):
if (default_type == cx_Oracle.DB_TYPE_NUMBER) &
(df[df.columns[idx]].dtype=='object'):
df[df.columns[idx]] = df[df.columns[idx]].astype(float)