什么dtype用于pandas数据帧中的货币表示?

use*_*ty1 13 python python-3.x pandas

所以我有一个pandas dataframe对象,其中包含两列小数位的精度,如"133.04".没有带有3个或更多小数位的数字,只有两个.

我的尝试:十进制模块

我已经尝试使用Decimal模块,但是当我尝试像这样重新采样时

gr_by_price = df['price'].resample(timeframe, how='ohlc')
Run Code Online (Sandbox Code Playgroud)

我明白了

pandas.core.groupby.DataError: No numeric types to aggregate
Run Code Online (Sandbox Code Playgroud)

在此之前我检查dtype

print(type(df['price'][0]))
<class 'decimal.Decimal'>
Run Code Online (Sandbox Code Playgroud)

我是这个图书馆和资金处理的新手,也许Decimal不是这个的正确选择?我该怎么办?

如果我将此列投射到<class 'numpy.float64'>一切正常.

更新:现在我正在使用这种方法

d.Decimal("%0.2f" % float(d.Decimal("1.04")))
Decimal('1.04')
Run Code Online (Sandbox Code Playgroud)

这个问题

Ale*_*rov 15

我们遇到了类似的问题,最好的想法是将它乘以100并将其表示为整数
(并使用/ 100表示​​打印/外部选项).
它将导致快速精确的计算(1 + 2 == 3不像0.1 + 0.2!= 0.3)


Cha*_*les 7

我过去也遇到过这个问题,我最终使用的解决方案是将货币表示为其最低面额的倍数(即美元兑换1美分).因此,类型将是int.如此处所述,此方法的优点是可以执行无损整数计算.

Price (currency) = Multiplyer * Sub_unit
Run Code Online (Sandbox Code Playgroud)

例如.对于美元,价格的单位是美元,子单位是1美分,乘数是100.

我想提到的另一个方面是,这在不同货币中运作良好.例如,日元的最小面额是1日元,在这种情况下乘数是1.印度尼西亚卢比的最小面额是1000卢比,所以乘数也可以是1.您只需记住每种货币的乘数即可.

实际上,您甚至可以创建一个自定义类来为您包装此转换,这可能是最方便的解决方案.