首页 > 解决方案 > 一种将转换器应用于 pandas.read_sql 的方法?

问题描述

得知我必须应用converters参数(而不是dtype)来拥有一个 pandasdecimal.Decimal类的列之后,我尝试使用我用来访问 SQLite 数据库的模块来做到这一点。然而,虽然这个参数在 中实现pd.read_csv并且可以作为 kwarg 在 中使用pd.read_excel,但情况并非如此pd.read_sql

In [1]: df = pd.read_sql('SELECT * FROM table', myconnection, converters={'somecol':decimal.Decimal})
Traceback (most recent call last):

  File "<ipython-input-13-abdc559366bb>", line 1, in <module>
    pd.read_sql('SELECT * FROM table', myconnection, converters={'somecol':decimal.Decimal})

TypeError: read_sql() got an unexpected keyword argument 'converters'

有没有办法在本地进行转换?该函数的文档表明pd.read_sql根本不允许任何 kwargs。

如果不可能,哪个是最推荐的解决方案?我可以使用df['somecol'] = df['somecol'].apply(decimal.Decimal),但我想知道在这种情况下是否有一种不那么冗长的方式。

标签: pythonpandas

解决方案


解决方法可以在SQLite3自己的文档中找到,通过register_converter函数然后在连接上调用一个参数:

import sqlite3
from decimal import Decimal

def conv(i):
    # Converts a number input to decimal.
    return Decimal(str(i))

sqlite3.register_converter('REAL', conv)

con = sqlite3.connect('something.db', detect_types=sqlite3.PARSE_DECLTYPES)

这样,在 SQLite 中存储为实数的所有数字将Decimal在读取时自动转换为。


Obs:请注意,conv函数中小数点之前的字符串转换是为了保留数字的状态而发生的(尽管调用conv(1.1+2.2)无论如何都会导致格式错误的小数。


推荐阅读