2012-09-24 55 views

Trả lời

20

Nếu bạn có thể cài đặt tuyệt vời dateutil gói, bạn có thể làm điều này:

>>> 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

Cảm ơn Burhan, tôi đã thử giải pháp của bạn và dường như tính toán năm và tháng như mong đợi/chính xác. Cảm ơn về sự hỗ trợ. –

10

Trong python, trừ hai đối tượng datetime.date dẫn đến một datetime.timedelta object, có thuộc tính days.

Biến số ngày chênh lệch thành năm và tháng không được xác định rõ ràng; nếu bạn định nghĩa một năm như 365 ngày và một tháng 30 ngày, bạn có thể sử dụng:

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

Hoặc, bạn có thể xác định trung bình độ dài năm và tháng được (hơi) chính xác hơn:

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) 

Với tính toán thứ hai, sự khác biệt thứ hai của bạn là 11 năm và tháng.

+0

Hoàn toàn đồng ý rằng bạn cần xác định "chênh lệch 1 tháng" thực sự có ý nghĩa gì. Nhưng là * thực sự * cầu kỳ, chia cho khoảng 30,45 có thể cho kết quả tốt hơn, như trên trung bình đó là khoảng bao lâu một tháng như vậy sẽ chính xác hơn trong thời gian dài. –

+0

@StuCox: '365/12.0' là' 30.416666666666668', thực sự. Có, bạn có thể lưu trữ giá trị đó là độ dài trung bình tháng. –

+0

Đừng quên năm nhuận ... (mỗi 4, nhưng không chia hết cho 100, trừ khi chia hết cho 400) để 365,2425 ngày mỗi năm, chia cho 12 = 30.436875. ** Điều này đang trở nên ngớ ngẩn. ** –

1

đối tượng timedelta không có thông tin về tháng, bạn có thể được tốt hơn để tính toán những năm qua và tháng trực tiếp

>>> 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) 
Các vấn đề liên quan