4

假设我在几个月内使用相对增量。

问题是当我这样做时:

x = relativedelta(months=12)
x.months
> 0

当我尝试做这样的事情时,这是一个问题:

y = relativedelta(months=12) - relativedelta(months=4)

y
> relativedelta(years=+1, months=-4)

y.months
> -4 

我希望一个月的价值为 8 (12 - 4)。任何人都知道如何最好地解决这个问题,以便我可以实现我正在寻找的输出?

4

2 回答 2

4

relativedelta(months=12)实际上relativedelta(years=+1)它会自动将月转换为年。例如months=13会导致relativedelta(years=+1, months=+1)

此外,仅当月份低于-11 或高于11 时,年份才会发生变化。因此,如果操作后的金额 months仍在-11 和11 之间,则年份不会发生变化。

解决方案是您需要同时查看rdelta.yearsrdelta.months值以获得您正在寻找的“净月数”。

def total_months(rdelta):
    return (rdelta.years * 12) + rdelta.months

您可以子类化relativedelta以使其更直观地供您使用。

class reldelta(relativedelta):
    @property
    def total_months(self):
        return (self.years * 12) + self.months

然后

>>> delta = reldelta(years=1) - relativedelta(months=4)
>>> delta
reldelta(years=+1, months=-4)
>>> delta.total_months
8

当然,如果您想将天数考虑在内,这可能会变得混乱,因为一个月中的天数会发生变化。这就是为什么days不像几个月那样有界

>>> relativedelta(days=9999)
relativedelta(days=+9999)
于 2016-10-28T13:47:12.050 回答
0
y = (relativedelta(months=12) - relativedelta(months=4)).months % 12

本质上,我使用模数来减轻越界值(<0 和 >12)。

于 2016-10-28T12:56:39.983 回答