2016-10-28 16 views
1

私は、数ヶ月間の相対デルタを使って作業しているとします。私が行うときPythonのrelativedeltaを月単位で扱う場合

問題がある:

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)。誰も私が探している出力を達成するために、これに最も近づける方法を知っていますか?

+0

'relativedelta(ヶ月= 12)'され、実際に 'relativedelta(年= + 1)'それは自動的に数ヶ月から数年を変換しています。たとえば 'months = 13'の場合、' relativedelta(years = + 1、months = + 1) 'という結果になります。 – sytech

答えて

0
y = (relativedelta(months=12) - relativedelta(months=4)).months % 12 

本質的に、私は、境界値(< 0と> 12)の外を軽減するためにモジュロを使用しています。

-1

relativedelta(months=12)は実際にはrelativedelta(years=+1)です。それは自動的に月から年に変換されます。たとえばmonths=13運転後monthsの量は-11と11の間に残っているので、場合ヶ月は-11下または11より上に行くときの年のみに変更、さらにrelativedelta(years=+1, months=+1)

につながる、今年は変更されません。

あなたが探している「ネット月間」を得るには、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)