python - “品脱”中派生维度中数量的标准格式
问题描述
TLDR:我希望将pint
某个(派生)维度中的数量默认转换为预设单位。
细节:
我处理 5 个维度,如下所示。请注意,[power](通常以 MW 为单位)和 [price](通常以 Eur/MWh 为单位)是派生维度。
# units.txt
# Base dimensions and their units
hour = [time] = h = hr
megawatthour = [energy] = MWh
euro = [currency] = Eur = €
# Derived dimensions and their units
[power] = [energy] / [time]
megawatt = megawatthour / hour = MW
[price] = [currency] / [energy]
euro_per_MWh = euro / megawatthour = Eur/MWh
我的问题:是否可以指定具有维度 [power] 的计算量默认转换为 MW?
这是一个例子:
import pint
ureg = pint.UnitRegistry("units.txt",)
ureg.default_format = ".0f~P"
energy = 100 * ureg.MWh
time = 4 * ureg.h
revenue = 4000 * ureg.euro
price = revenue / energy
power = energy / time
print(energy, time, revenue, price, power)
# 100 MWh 4 h 4000 Eur 40 Eur/MWh 25 MWh/h
在这里,由于计算方式的原因,功率以MWh/h表示,我可以通过调用将其“转换”为MWpower.to('MW')
。每次计算此维度中的数量时是否可以自动执行此操作?
请注意,.to_base_units()
对所有数量进行覆盖会将其恢复为MWh/h。
评论:
- 我不想使用 [power] 作为基本维度。无论如何,它将问题转移到价格上。
- 我知道前缀;我只是将它们留在这里以使示例尽可能简短。
解决方案
据我所知,Pint 目前不支持设置所需的转换首选项。在项目 repo 上有一些关于这个的讨论,这个问题链接到一系列相关问题。
您可以通过一些自定义代码来实现您想要的,但需要注意的是输出需要包装在一个函数中。
# units-2.txt
# Base dimensions and their units
hour = [time] = h = hr
megawatt = [power] = MW
euro = [currency] = Eur = €
# Derived dimensions and their units
[energy] = [power] * [time]
megawatthour = megawatt * hour = MWh
[price] = [currency] / [energy]
euro_per_MWh = euro / megawatthour = Eur/MWh
import pint
preference = ["Eur/MWh", 'MW']
def beautify(x, preference=preference):
for preferred_unit in preference:
try:
return x.to(preferred_unit)
except pint.DimensionalityError:
pass
# if no preferred unit fits, leave it as it is
return x
def test_defs(file):
print(file)
ureg = pint.UnitRegistry(file,)
ureg.default_format = ".0f~P"
energy = 100 * ureg.MWh
time = 4 * ureg.h
revenue = 4000 * ureg.euro
price = revenue / energy
power = energy / time
print(time.to_base_units())
print(f"beautified time: {beautify(time)}") # Units with no preference remain the same.
print(power.to_base_units())
print(f"beautified power: {beautify(power)}") # Units with preference can be changed.
print(price.to_base_units())
print(f"beautified price: {beautify(price)}") # Units with preference can be changed.
test_defs("units.txt")
test_defs("units-2.txt")
这将打印
units.txt
4 h
beautified time: 4 h
25 MWh/h
beautified power: 25 MW
40 Eur/MWh
beautified price: 40 Eur/MWh
units-2.txt
4 h
beautified time: 4 h
25 MW
beautified power: 25 MW
40 Eur/MW/h
beautified price: 40 Eur/MWh
推荐阅读
- postgresql - Acces ODBC passthru 查询失败,错误 3146 给出不同的错误描述文本
- python - 在 WxPython 中的 StaticBitmap 上放置一个位图
- javascript - 如何在浏览器中使用带有纯 html 和 javascript 的 IPFS
- typescript - 具有泛型类型并使用字符串作为默认参数的函数
- javascript - 具有特定 URL 的 azure devops 中的 Testcafe
- python - request.body 中的 i 错误:TypeError: 'builtin_function_or_method' 对象不可迭代
- pandas - Fillna by Gruopby pandas Dataframe 从其他列中的值中选择最常见的值
- javascript - 为什么这个阴影 DOM 高度只有 100%,有两个高度?
- html - 在不同的div中对齐多个img
- firebase - 无法访问 Firebase 模拟器 UI