如何在 Pint 中定义和使用百分比
How to define and use percentage in Pint
我目前正在使用 Pint 来处理单位和单位转换。这似乎适用于已在 Pint 中定义的单位,例如
>>> import pint
>>> ureg = pint.UnitRegistry()
>>> Q = ureg.Quantity
>>> a = Q(5, 'm/s')
>>> a
<Quantity(5, 'meter / second')>
>>> a.to('ft/s')
<Quantity(16.404199475065617, 'foot / second')>
我试过define my own units,它代表百分比。就单位换算而言,百分比只是无量纲分数的 100 倍,这就是我的定义。
>>> ureg.define('percent = dimensionless * 100 = pct')
>>> a = Q(5, 'pct')
>>> a
<Quantity(5, 'percent')>
但是我似乎无法在分数 ('dimensionless'
) 和 'pct'
之间来回转换。
>>> a.to('dimensionless')
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
a.to('dimensionless')
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\quantity.py", line 263, in to
magnitude = self._convert_magnitude_not_inplace(other, *contexts, **ctx_kwargs)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\quantity.py", line 231, in _convert_magnitude_not_inplace
return self._REGISTRY.convert(self._magnitude, self._units, other)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\unit.py", line 1026, in convert
return self._convert(value, src, dst, inplace)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\unit.py", line 1042, in _convert
src_dim = self._get_dimensionality(src)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\unit.py", line 813, in _get_dimensionality
self._get_dimensionality_recurse(input_units, 1.0, accumulator)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\unit.py", line 837, in _get_dimensionality_recurse
self._get_dimensionality_recurse(reg.reference, exp2, accumulator)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\unit.py", line 835, in _get_dimensionality_recurse
reg = self._units[self.get_name(key)]
KeyError: ''
我基本上想做的是能够在例如之间进行转换。 “0.73”和“73%”。我如何定义和使用这样的单位?
GitHub 期 hgrecco/pint#185 似乎涵盖了您描述的情况。
使用该问题中讨论的变通方法对我使用 Pint-0.7.2
:
有效
from pint.unit import ScaleConverter
from pint.unit import UnitDefinition
import pint
ureg = pint.UnitRegistry()
Q = ureg.Quantity
ureg.define(UnitDefinition('percent', 'pct', (), ScaleConverter(1 / 100.0)))
a = Q(5, 'pct')
print a
print a.to('dimensionless')
输出:
5 percent
0.05 dimensionless
我遇到了同样的问题,并提出了一个似乎很有效的简单解决方案。
import pint
ureg = pint.UnitRegistry()
ureg.define('fraction = [] = frac')
ureg.define('percent = 1e-2 frac = pct')
ureg.define('ppm = 1e-6 fraction')
print(ureg('100 pct').to('dimensionless'))
print(ureg('0.5 dimensionless').to('pct'))
print(ureg('pct').to('ppm'))
print(ureg('1e4 ppm').to('pct'))
输出:
1.0 dimensionless
50.0 percent
10000.0 ppm
0.9999999999999999 percent
(注意最后一行略有舍入误差。)
我从默认 units dictionary 获得了语法,其中基本单位定义为
# reference
gram = [mass] = g # dimensional
radian = [] = rad # dimensionless
我目前正在使用 Pint 来处理单位和单位转换。这似乎适用于已在 Pint 中定义的单位,例如
>>> import pint
>>> ureg = pint.UnitRegistry()
>>> Q = ureg.Quantity
>>> a = Q(5, 'm/s')
>>> a
<Quantity(5, 'meter / second')>
>>> a.to('ft/s')
<Quantity(16.404199475065617, 'foot / second')>
我试过define my own units,它代表百分比。就单位换算而言,百分比只是无量纲分数的 100 倍,这就是我的定义。
>>> ureg.define('percent = dimensionless * 100 = pct')
>>> a = Q(5, 'pct')
>>> a
<Quantity(5, 'percent')>
但是我似乎无法在分数 ('dimensionless'
) 和 'pct'
之间来回转换。
>>> a.to('dimensionless')
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
a.to('dimensionless')
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\quantity.py", line 263, in to
magnitude = self._convert_magnitude_not_inplace(other, *contexts, **ctx_kwargs)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\quantity.py", line 231, in _convert_magnitude_not_inplace
return self._REGISTRY.convert(self._magnitude, self._units, other)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\unit.py", line 1026, in convert
return self._convert(value, src, dst, inplace)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\unit.py", line 1042, in _convert
src_dim = self._get_dimensionality(src)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\unit.py", line 813, in _get_dimensionality
self._get_dimensionality_recurse(input_units, 1.0, accumulator)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\unit.py", line 837, in _get_dimensionality_recurse
self._get_dimensionality_recurse(reg.reference, exp2, accumulator)
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\unit.py", line 835, in _get_dimensionality_recurse
reg = self._units[self.get_name(key)]
KeyError: ''
我基本上想做的是能够在例如之间进行转换。 “0.73”和“73%”。我如何定义和使用这样的单位?
GitHub 期 hgrecco/pint#185 似乎涵盖了您描述的情况。
使用该问题中讨论的变通方法对我使用 Pint-0.7.2
:
from pint.unit import ScaleConverter
from pint.unit import UnitDefinition
import pint
ureg = pint.UnitRegistry()
Q = ureg.Quantity
ureg.define(UnitDefinition('percent', 'pct', (), ScaleConverter(1 / 100.0)))
a = Q(5, 'pct')
print a
print a.to('dimensionless')
输出:
5 percent
0.05 dimensionless
我遇到了同样的问题,并提出了一个似乎很有效的简单解决方案。
import pint
ureg = pint.UnitRegistry()
ureg.define('fraction = [] = frac')
ureg.define('percent = 1e-2 frac = pct')
ureg.define('ppm = 1e-6 fraction')
print(ureg('100 pct').to('dimensionless'))
print(ureg('0.5 dimensionless').to('pct'))
print(ureg('pct').to('ppm'))
print(ureg('1e4 ppm').to('pct'))
输出:
1.0 dimensionless
50.0 percent
10000.0 ppm
0.9999999999999999 percent
(注意最后一行略有舍入误差。)
我从默认 units dictionary 获得了语法,其中基本单位定义为
# reference
gram = [mass] = g # dimensional
radian = [] = rad # dimensionless