如何在Python中设置百分比差异的格式



我必须使用Python显示两个百分比之间的差异。例如,40%和41.234%之间的差异为1.234个百分点,即1.234页。

如果我想将增长格式化为百分比,我会使用格式说明符{:.0%}:

increase = 0.01234
"{:+.3%} ".format(increase)
>>> "+1.234 %"

我在找什么

pp替换%的格式说明符,如下所示:

"{some_specifier} ".format(increase)
>>> "+1.234 pp"

我不想找什么

我知道我可以使用像这样的f字符串

f"{increase * 100:+.3f} pp"
>>> "+1.234 pp"

但我特别想找一个可以与.format()一起使用的格式说明符。

编辑

我意识到一点背景知识在这里可能有用。在我的实现中,increase可以表示一个普通的浮点、整数、百分比或百分点。为了获得正确的表示,我使用了一个看起来像的可变格式映射

format_mapping = {
"var_x": "{:,.0f}",    # for large numbers
"var_y": "{:+.3f}",    # for small numbers
"var_z": "{:.4%}",     # for percentages
}

变量名表示pandas数据帧my_data的列名,因此为了报告,我可以将格式应用于这些列

for var in my_data.columns:
fmt = format_mapping[var]
my_data[var] = pd.Series(fmt.format(value) for value in my_data[var])

使用内联管道和Format类的子类可能可以做一些事情,但在这种情况下,我认为只编写函数来处理它可能更容易:

def pct(num, digits=0):
return '{:+.{}} pp'.format(num * 100, digits)
...
f"{pct(increase, 4)}"
# '+1.234 pp'

然后,如果需要,可以将所有这些函数放在它们自己的文件中,并通过在f-string中调用它们来调用它们。

您可以声明自定义格式化程序,并通过重写Formatter.format_field()方法将"%"替换为"pp"

from string import Formatter    
class MyFormatter(Formatter):
def format_field(self, value, spec):
if spec.endswith("p"):
return super(MyFormatter, self).format_field(value, spec[:-1] + "%")[:-1] + "pp"
else:
return super(MyFormatter, self).format_field(value, spec)

用法:

print(MyFormatter().format("%: {0:+.3%}; pp: {0:+.3p}", 0.01234))

附言:在python 3中,您可以在没有参数的情况下使用super()

您可以使用以下内容:

increase = 0.01234
print("{:+.4} {}".format(increase*100, "pp"))

结果:

+1.234 pp

最新更新