首页 > 解决方案 > “品脱”中派生维度中数量的标准格式

问题描述

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

评论:

标签: pythonpint

解决方案


据我所知,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

推荐阅读