首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中的单位转换

Python中的单位转换
EN

Stack Overflow用户
提问于 2009-06-22 00:41:11
回答 4查看 11.9K关注 0票数 11

SymPy是用Python语言进行单位转换的一个很棒的工具:

代码语言:javascript
运行
复制
>>> from sympy.physics import units
>>> 12. * units.inch / units.m
0.304800000000000

你可以很容易地使用你自己的:

代码语言:javascript
运行
复制
>>> units.BTU = 1055.05585 * units.J
>>> units.BTU
1055.05585*m**2*kg/s**2

但是,我无法将其实现到我的应用程序中,除非我可以将C度(绝对值)到K度再到F度再到R度,或者它们的任何组合。

我想也许这样的方法能行得通:

代码语言:javascript
运行
复制
units.degC = <<somefunc of units.K>>

但很明显,这是一条错误的道路。对于在SymPy中干净地实现“偏移”-type单位转换,有什么建议吗?

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

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

我假设°F和°C总是指表达式中的Δ°F和Δ°C,但在独立时指的是绝对。我只是想知道是否有一种方法可以使units.degF成为一个函数,并在其上添加一个装饰器property()来处理这两种情况。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-22 01:07:29

我个人喜欢Quantities,因为它集成了NumPy,但是它只做相对温度,而不是绝对温度。

票数 4
EN

Stack Overflow用户

发布于 2009-06-22 01:00:47

Unum文档很好地解释了为什么这很难:

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

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

很容易从概念上看出试图用符号表示绝对温度转换的问题。对于任何正常的相对单位,(x unit) * 2 == (x * 2) unit-unit数学都是可交换的。有了绝对温度,这就分解了--很难做比没有其他单位维度的直接温度转换更复杂的事情了。您最好将所有计算都保存在开尔文中,并仅在代码的入口点和出口点进行其他温度单位的转换。

票数 8
EN

Stack Overflow用户

发布于 2009-06-22 02:04:55

例如,它是如何工作的:

代码语言:javascript
运行
复制
>>> 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1025145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档