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.years調べる必要があるということです。rdelta.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

もちろん、1 か月の日数が変化するため、これに日数を加味しようとすると、これは面倒になる可能性があります。これが、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 に答える