将转换器应用于pandas.read_sql的方法?

2024-09-28 17:21:11 发布

您现在位置:Python中文网/ 问答频道 /正文

learning我必须应用converters参数(而不是dtype)来获得decimal.Decimal类的pandas列之后,我尝试使用一个模块来访问SQLite数据库。然而,尽管此参数在pd.read_csv中实现,并且在pd.read_excel中作为kwarg提供,但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'

有没有办法在本地进行转换?函数的documentation表示pd.read_sql根本不允许任何KWARG

如果不可能,最推荐的解决方案是什么?我可以使用df['somecol'] = df['somecol'].apply(decimal.Decimal),但我想知道在这种情况下是否有一种不太详细的方法


Tags: fromdfreadsql参数table情况select
1条回答
网友
1楼 · 发布于 2024-09-28 17:21:11

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

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)将导致格式错误的小数)

相关问题 更多 >