11

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 度到 F 度到 R 度,或者它们的任何组合。

我想也许这样的事情会起作用:

units.degC = <<somefunc of units.K>>

但显然,这是错误的下坡路。关于在 SymPy 中干净地实现“偏移”型单位转换的任何建议?

注意:我愿意尝试其他单位转换模块,但不知道除了Unum之外的任何模块,发现它很麻烦。

编辑:好的,现在很清楚我想要做的是首先确定要比较的两个量是否在同一个坐标系中。(如时间单位参考不同的时期或时区或dB到直线幅度),进行适当的转换,然后进行转换。有没有通用的坐标系管理工具?那太好了。

我会假设°F 和°C 在表达式中始终指代Δ°F Δ°C,但在单独站立时指的是绝对值。我只是想知道是否有一种方法可以创建units.degF一个函数并在其上添加一个装饰器property()来处理这两个条件。

但是现在,我将设置units.C == units.K并尝试在文档中非常清楚地使用函数convertCtoK(...)以及convertFtoR(...)在处理绝对单位时。(开个玩笑。不,我不会。)

4

4 回答 4

8

Unum 文档有一篇很好的文章说明了为什么这很难:

Unum 无法可靠地处理摄氏度和开尔文之间的转换。该问题被称为“假原点问题”:0°Celsius 定义为 273.15 K。这确实是一个特殊且令人讨厌的情况,因为通常值 0 不受单位转换的影响,例如 0 [m] = 0 [英里] = ... 在这里,转换开尔文/摄氏度的特征是因子 1 和 273.15 K 的偏移量。在当前版本的 Unum 中,偏移量是不可行的。

此外,它可能永远不会集成到未来的版本中,因为还有一个概念问题:如果数量代表绝对温度,则应该应用偏移量,但如果数量代表温度差异,则不应该应用。例如,温度升高 1°C 相当于升高 1K。无法猜测用户心中的想法是绝对温度还是相对温度。绝对量与相对量的问题对于其他单位来说并不重要,因为答案不会影响转换规则。Unum 无法区分这两种情况。

从概念上很容易看出尝试象征性地表示绝对温度转换的问题。对于任何正常的相对单位,-(x unit) * 2 == (x * 2) unit单位数学都是可交换的。对于绝对温度,它会被打破 - 很难做任何比没有其他单位尺寸的直接温度转换更复杂的事情。您可能最好将所有计算保持在开尔文中,并仅在代码的入口和出口点与其他温度单位进行转换。

于 2009-06-22T01:00:47.443 回答
4

由于它的NumPy集成,我个人喜欢Quantities,但它只做相对温度,而不是绝对温度。

于 2009-06-22T01:07:29.177 回答
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
于 2009-06-22T02:04:54.740 回答
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还处理非线性单位,例如分贝,而不仅仅是那些具有诸如摄氏度华氏度之类的偏移量的单位。

关于你给出的第一个例子,你可以这样做:

>>> 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
于 2014-08-08T20:01:45.460 回答