SymPy是在Python中进行单位转换的绝佳工具:
>>> from sympy.physics import units
>>> 12. * units.inch / units.m
0.304800000000000
您可以轻松自己动手:
>>> units.BTU = 1055.05585 * units.J
>>> units.BTU
1055.05585*m**2*kg/s**2
但是,我无法将此实现到我的应用程序中,除非我可以将C度(绝对值)转换为K度,将度数转换为度数R或其任何组合。
我想也许这样的事情会起作用:
units.degC = <<somefunc of units.K>>
但显然这是走错路。有关在SymPy中干净地实现“偏移”型单位转换的建议吗?
注意:我愿意尝试其他单位转换模块,但除了Unum之外不知道任何单位转换模块,并且发现它很麻烦。
编辑:好的,现在很清楚,我想要做的是首先确定要比较的两个量是否在同一个坐标系中。 (如时间单位参考不同的时期或时区或dB到直线幅度),进行适当的变换,然后进行转换。有没有通用的坐标系管理工具?那太好了。
我会假设°F和°C总是指表达式中的Δ°FΔ°C,但是单独站立时指的是绝对值。我只是想知道是否有办法让units.degF
成为一个函数并在其上拍一个装饰器property()
来处理这两个条件。
但是现在,我将设置units.C == units.K
并尝试在文档中明确说明在处理绝对单位时使用函数convertCtoK(...)
和convertFtoR(...)
。 (开个玩笑。不,我不会。)
答案 0 :(得分:8)
Unum文档有一个非常好的文章,说明为什么这很难:
Unum无法在°C和开尔文之间可靠地处理转换。该问题被称为“错误原点问题”:0°C被定义为273.15 K.这实际上是一种特殊且烦人的情况,因为通常值0不受单位转换的影响,例如0 [m] = 0 [英里] = ....这里,转换开尔文/摄氏度的特征是因子1和偏移量273.15 K.在当前版本的Unum中偏移是不可行的。
此外,它可能永远不会被整合到未来版本中,因为还存在一个概念性问题:如果数量代表绝对温度,则应该应用偏移量,但如果数量代表温度差异则不应该应用偏移量。例如,1摄氏度的温度升高相当于1 K的升高。不可能猜出用户心中的含量,无论是绝对温度还是相对温度。绝对与相对数量的问题对其他单位而言并不重要,因为答案不会影响转换规则。 Unum无法区分这两种情况。
从概念上看,尝试用符号表示绝对温度转换很容易。对于任何正常的相对单位,(x unit) * 2 == (x * 2) unit
- 单位数学是可交换的。绝对温度会导致故障 - 除了没有其他单位尺寸的直接温度转换之外,很难做更复杂的事情。您可能最好将所有计算保持为开尔文,并仅在代码的入口和出口处转换为其他温度单位。
答案 1 :(得分:4)
我个人喜欢Quantities归功于它NumPy的整合,但它只是相对温度,而不是绝对温度。
答案 2 :(得分:0)
示例,它是如何工作的:
>>> T(0*F) + 10*C
T(265.37222222222221*K) # or T(47767/180*K)
>>> T(0*F + 10*C)
T(283.15*K)
>>> 0*F + T(10*C)
T(283.15*K)
>>> 0*F + 10*C
10*K
>>> T(0*F) + T(10*C)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'absolute_temperature' and \
'absolute_temperature'
>>> T(0*F) - T(10*C)
T(245.37222222222223*K) # or T(44167/180*K)
>>> 0*F - 10*C
-10*K
答案 3 :(得分:0)
natu包处理温度单位。例如,您可以这样做:
>>> from natu.units import K, degC, degF
>>> T = 25*degC
>>> T/K
298.1500
>>> T/degF
77.0000
>>> 0*degC + 100*K
100.0 degC
也支持前缀:
>>> from natu.units import mdegC
>>> 100*mdegC/K
273.2500
natu也处理decibel等非线性单位,而不仅仅是degree Celsius和degree Fahrenheit等偏移量。
关于您提供的第一个示例,您可以这样做:
>>> from natu import units
>>> 12*units.inch/units.m
0.3048
BTU已经内置。您可以将其显示单位更改为m ** 2 * kg / s ** 2,但默认情况下natu将单位简化为J:
>>> from natu.units import BTU
>>> BTU.display = 'm2*kg/s2'
>>> 1*BTU
1055.05585262 J