python - 一种将转换器应用于 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)
,但我想知道在这种情况下是否有一种不那么冗长的方式。
解决方案
解决方法可以在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)
无论如何都会导致格式错误的小数。
推荐阅读
- javascript - 如何输入状态数组和对象的道具?
- r - 在数据 R 中找不到列名时返回文本
- android - 如何在 CodenameOne 原生界面中使用具有自定义布局的 Android 库?
- python - 有没有办法让这个 python selenium 代码在无头模式下工作?
- c++ - 禁用 std::shared_ptr 的清理
- reactjs - subscribe() 没有功能,不能 getState()
- openshift - 无法启动部署在 OpenShift 中的 springboot 应用程序
- reactjs - 在回调中使用它
- c++ - 第一个 cout 语句末尾的空格显示在第二个 cout 的开头
- php - RuntimeException:尚未设置外观根