2012-09-24 3 views
7

두 datetime.date() 날짜와 년과 월의 차이를 계산하고 싶습니다.두 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. 

감사합니다.

답변

20

, 당신은이 작업을 수행 할 수있는 년 직접 개월을 계산하기 위해 더 좋을 수도, 달에 대한 정보가 없습니다 :

>>> 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' 
+0

감사합니다. Burhan, 저는 귀하의 솔루션을 시도했으며 예상 한대로 정확하게 년과 월을 계산하는 것으로 보입니다. 도와 주셔서 감사합니다. –

10

두 개의 datetime.date 객체를 뺀 결과는 이며, days 속성을가집니다.

일수 차이를 년과 월로 바꾸는 것은 명확하게 정의되어 있지 않습니다. 보다 정확한 당신이 (약간)로 평균 연도와 월 길이를 정의 할 수 있습니다,

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

을 또는 : 365 일로 년 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) 

후자의 계산에서 두 번째 차이점은 11 년으로 개월이됩니다.

+0

"1 개월 차이"가 실제로 무엇을 의미하는지 정의해야한다는 데 전적으로 동의합니다. 그러나 약 30.45로 나눠서 * 까다 롭습니다. 평균적으로 한 달이 얼마나 오랜 시간 동안 더 정확할 것인지에 대한 평균보다 나은 결과를 제공 할 수 있습니다. –

+0

@StuCox :'365/12.0'은'30.416666666666668'입니다. 예, 그 값을 평균 월 길이로 저장할 수 있습니다. –

+0

윤년을 잊지 마라. (매 4 회, 100으로 나눌 수없는 경우, 400으로 나눌 수 없다면) 365.2425 일을 12 = 30.436875로 나눈다. ** 바보가되고있다. ** –

1

timedelta 개체는 당신이 우수한 dateutil 패키지를 설치 할 수있는 경우

>>> 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) 
관련 문제