Pau*_*aul 11 python math symbolic-math sympy
SymPy是在Python中进行单位转换的绝佳工具:
>>> from sympy.physics import units
>>> 12. * units.inch / units.m
0.304800000000000
Run Code Online (Sandbox Code Playgroud)
你可以轻松自己动手:
>>> units.BTU = 1055.05585 * units.J
>>> units.BTU
1055.05585*m**2*kg/s**2
Run Code Online (Sandbox Code Playgroud)
但是,我无法将此实现到我的应用程序中,除非我可以将度C(绝对值)转换为K到度数F到度数R或其任何组合.
我想也许这样的事情会起作用:
units.degC = <<somefunc of units.K>>
Run Code Online (Sandbox Code Playgroud)
但显然这是走错路.在SymPy中干净地实现"偏移"型单位转换的任何建议?
注意:我愿意尝试其他单元转换模块,但除了Unum之外不知道任何其他单元,并且发现它很麻烦.
编辑:好的,现在很清楚,我想要做的是首先确定要比较的两个量是否在同一个坐标系中.(如时间单位参考不同的时期或时区或dB到直线幅度),进行适当的变换,然后进行转换.有没有通用的坐标系管理工具?那太好了.
我会假设°F和°C总是指表达式中的Δ°FΔ°C,但是单独站立时指的是绝对值.我只是想知道是否有办法制作units.degF一个函数并property()在其上拍一个装饰器来处理这两个条件.
但是现在,我将设置units.C == units.K并尝试在文档中清楚地说明使用函数convertCtoK(...)和convertFtoR(...)处理绝对单位时.(开个玩笑.不,我不会.)
Unum文档有一个非常好的文章,说明为什么这很难:
Unum无法可靠地处理摄氏度和开尔文之间的转换.这个问题被称为"假原点问题":0°C被定义为273.15 K.这实际上是一个特殊而烦人的情况,因为通常值0不受单位转换的影响,例如0 [m] = 0 [英里] = .... 这里,转换开尔文/摄氏度的特征在于因子1和273.15K的偏移.在当前版本的Unum中偏移是不可行的.
此外,它可能永远不会被整合到未来版本中,因为还存在一个概念性问题:如果数量代表绝对温度,则应该应用偏移量,但如果数量代表温度差异则不应该应用偏移量.例如,1摄氏度的温度升高相当于1 K的升高.不可能猜出用户心中的含量,无论是绝对温度还是相对温度.绝对与相对数量的问题对其他单位而言并不重要,因为答案不会影响转换规则.Unum无法区分这两种情况.
从概念上看,尝试用符号表示绝对温度转换很容易.对于任何正常的相对单位,(x unit) * 2 == (x * 2) unit-unit数学是可交换的.绝对温度会导致故障 - 除了没有其他单位尺寸的直接温度转换之外,很难做更复杂的事情.您可能最好将所有计算保持为开尔文,并仅在代码的入口和出口处转换为其他温度单位.