9

2 つの datetime.date() 日付の差を年と月で計算したいと考えています。

例えば;

d1 = date(2001,5,1)  
d2 = date(2012,1,1)   
d3 = date(2001,1,1)   
d4 = date(2012,5,1)   


diff1 = d2 - d1  
diff2 = d4 - d3

望ましい結果:

diff1 == 10 years & 8 months. 
diff2 == 11 years & 4 months.

ありがとう。

4

3 に答える 3

26

優れたdateutilパッケージをインストールできる場合は、次のようにします。

>>> from dateutil import relativedelta as rdelta
>>> from datetime import date
>>> d1 = date(2001,5,1)
>>> d2 = date(2012,1,1)
>>> rd = rdelta.relativedelta(d2,d1)
>>> "{0.years} years and {0.months} months".format(rd)
'10 years and 8 months'
于 2012-09-24T11:40:43.087 に答える
11

Python では、2 つのdatetime.dateオブジェクトを減算すると、属性を持つdatetime.timedeltaobjectが生成されます。days

日数の差を年と月に変えることは明確に定義されていません。1 年を 365 日、1 か月を 30 日と定義する場合、次のように使用できます。

years, remainder = divmod(diff1.days, 365)
months = remainder // 30

または、平均的な年と月の長さを (わずかに) より正確に定義することもできます。

avgyear = 365.2425        # pedants definition of a year length with leap years
avgmonth = 365.2425/12.0  # even leap years have 12 months
years, remainder = divmod(diff1.days, avgyear)
years, months = int(years), int(remainder // avgmonth)

後者の計算では、2 番目の違いは 11 年と3か月になります。

于 2012-09-24T11:29:38.593 に答える
1

timedelta オブジェクトには月に関する情報がありません。年と月を直接計算する方がよい場合があります。

>>> d2.year - d1.year + (d2.month - d1.month)/12,  (d2.month - d1.month)%12
(10, 8)
>>> d4.year - d3.year + (d4.month - d3.month)/12,  (d4.month - d3.month)%12
(11, 4)
于 2012-09-24T11:39:15.067 に答える