2011-08-10 13 views
28

संभव डुप्लिकेट:
Best way to find the months between two dates (in python)पायथन: महीनों में 2 datetimes का अंतर

मैं चाहूँगा पता है कि कैसे मैं इस अंतर के लिए महीने की सही संख्या हो सकता है:

date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S') 
date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d') 

दिनांक 2-दिनांक 1 परिणाम

datetime.timedelta(183, 43200) 

मैं महीनों की सही संख्या, इस मामले में यह और नहीं 6 (घंटे की वजह से) वापस करेगा जानना चाहूंगा

+0

यह सवाल पहले से ही यहाँ जवाब था: http://stackoverflow.com/questions/4039879/महीनों के बीच-दो-तिथियां-इन-पायथन – Dan

+0

घंटे के साथ डेटाटाइम के लिए नहीं –

+1

यह तय करने के बाद जवाब देना आसान होगा कि "महीनों की सटीक संख्या" का क्या अर्थ है। एक महीने एक निश्चित लंबाई अवधि नहीं है; यह 28 से 31 दिनों तक भिन्न हो सकता है। 1 जनवरी और 1 फरवरी 1 फरवरी 1 और 1 मार्च से अलग हैं; क्या आप दोनों अंतराल "बिल्कुल 1 महीने" कहते हैं? –

उत्तर

22

कितने दिन हर महीने है पता लगाने के लिए calendar मॉड्यूल का उपयोग करना, आप बस महीने भरोसा कर सकते हैं।

from calendar import monthrange 
from datetime import datetime, timedelta 

def monthdelta(d1, d2): 
    delta = 0 
    while True: 
     mdays = monthrange(d1.year, d1.month)[1] 
     d1 += timedelta(days=mdays) 
     if d1 <= d2: 
      delta += 1 
     else: 
      break 
    return delta 
5

यह कर का लाभ इस तरह से कुछ देखते हैं कि है मॉड्यूल निर्भरताएं और कोई लूपिंग नहीं - महीनों को सीधे गणना द्वारा पाया जा सकता है।

import datetime as dt 

def months_between(date1,date2): 
    if date1>date2: 
     date1,date2=date2,date1 
    m1=date1.year*12+date1.month 
    m2=date2.year*12+date2.month 
    months=m2-m1 
    if date1.day>date2.day: 
     months-=1 
    elif date1.day==date2.day: 
     seconds1=date1.hour*3600+date1.minute+date1.second 
     seconds2=date2.hour*3600+date2.minute+date2.second 
     if seconds1>seconds2: 
      months-=1 
    return months 

date1 = dt.datetime.strptime('2011-08-15 12:00:00', '%Y-%m-%d %H:%M:%S') 
date2 = dt.datetime.strptime('2012-02-15', '%Y-%m-%d') 
print(months_between(date1,date2)) 
# 5 

date1 = dt.datetime.strptime('2011-08-15 12:00:00', '%Y-%m-%d %H:%M:%S') 
date2 = dt.datetime.strptime('2012-02-15 11:59:00', '%Y-%m-%d %X') 
print(months_between(date1,date2)) 
# 5 

date2 = dt.datetime.strptime('2012-02-15 12:00:00', '%Y-%m-%d %X') 
print(months_between(date1,date2)) 
# 6 

date2 = dt.datetime.strptime('2012-02-15 12:00:01', '%Y-%m-%d %X') 
print(months_between(date1,date2)) 
# 6 
52

आप python-dateutil का उपयोग कर सकते हैं।

In [4]: from datetime import datetime 

In [5]: date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S') 

In [6]: date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d') 

In [7]: from dateutil import relativedelta 

In [8]: r = relativedelta.relativedelta(date1, date2) 

In [9]: r 
Out[9]: relativedelta(months=-5, days=-30, hours=-12) 
+5

यद्यपि: 'relativedelta.relativedelta (दिनांक (2015, 9, 30), दिनांक (2015, 10, 1))। महीनों की उपज 0 जो सही है लेकिन संभावित परिणाम को प्रतिबिंबित नहीं कर सकती है यदि आप जानना चाहते हैं कि महीने हैं अलग – ezdazuzena

13

सिर्फ आप आवश्यकताओं को आप को पूरा करना होगा पता है, लेकिन तथ्य यह है 183 दिनों और इन दो तिथियों के बीच 43200 एसआई सेकंड देखते हैं कि निर्धारित करने कितने महीनों "वास्तव में" है कि में एक अंतर्निहित आत्मीयता पर प्रकाश डाला गया।

एक महीने 30 दिन, या (365/12) दिन, या ((365 * 4 + 1)/48) दिन, या ...?

एक दिन हमेशा 86400 सेकेंड है, या आप ऐतिहासिक लीप सेकंड की गणना करते हैं, या आप भविष्य की तिथियों के लिए लीप सेकंड की भविष्यवाणी करते हैं?

ये निर्णय आपके द्वारा दिखाई देने वाले एल्गोरिदम के जवाब को प्रभावित करते हैं जो आपको इन सीमाओं के करीब होने वाली कुछ इनपुट तिथियों के लिए देगा।

मेरी राय में, यह अधिक सहज ज्ञान युक्त है इस उद्देश्य के लिए और समय की परमाणु इकाइयों के रूप में महीने पर विचार करने और इस सूत्र का उपयोग करने के लिए: (date2.year - date1.year) * 12 + (date2.month - date1.month)

+0

यह कुशल और अच्छी तरह से समझाया गया है, मेरी समस्या के लिए काम किया। –

संबंधित मुद्दे