दो दी गई तारीखों के बीच दिनों की संख्या की गणना कैसे करें?


505

अगर मैं दो तिथियों (उदा। है '8/18/2008'और '9/26/2008'), सबसे अच्छा तरीका है इन दो तिथियों के बीच दिनों की संख्या प्राप्त करने के लिए क्या है?

जवाबों:


799

यदि आपके पास दो दिनांक ऑब्जेक्ट हैं, तो आप उन्हें घटा सकते हैं, जो किसी timedeltaऑब्जेक्ट की गणना करता है ।

from datetime import date

d0 = date(2008, 8, 18)
d1 = date(2008, 9, 26)
delta = d1 - d0
print(delta.days)

डॉक्स के प्रासंगिक अनुभाग: https://docs.python.org/library/datetime.html

एक अन्य उदाहरण के लिए इस उत्तर को देखें ।


2
शानदार जवाब यहाँ। के बाद से लोगों का एक बहुत पांडा डेटा फ्रेम का उपयोग कर हो सकता है, सोचा था कि कैसे से कन्वर्ट करने के लिए पर लिंक की जांच करने के लिए उपयोगी हो सकता है np.datetime64के लिए python datetime stackoverflow.com/questions/52982056/...
Pramit

अच्छी बात यह है कि यह घोल लीप वर्षों के लिए सही डेल्टा भी देता है।
Lāsma

154

डेटाटाइम की शक्ति का उपयोग करना:

from datetime import datetime
date_format = "%m/%d/%Y"
a = datetime.strptime('8/18/2008', date_format)
b = datetime.strptime('9/26/2008', date_format)
delta = b - a
print delta.days # that's it

4
वास्तव में, डेट क्लास इस मामले में डेटाइम से अधिक उपयुक्त होगी।
जेरेमी कैंटरेल 15

10
@JeremyCantrell और फिर भी, आठ साल बाद, dateअभी भी इसके बराबर का अभाव है strptime()
JAB

क्यों की जरूरत है आर्ग? पहले arg तारीख के साथ स्पष्ट होना चाहिए जिसमें एक प्रारूप है। strptimeformat
तिमो


16

आप डेटाटाइम मॉड्यूल चाहते हैं।

>>> from datetime import datetime, timedelta 
>>> datetime(2008,08,18) - datetime(2008,09,26) 
datetime.timedelta(4) 

एक और उदाहरण:

>>> import datetime 
>>> today = datetime.date.today() 
>>> print(today)
2008-09-01 
>>> last_year = datetime.date(2007, 9, 1) 
>>> print(today - last_year)
366 days, 0:00:00 

जैसा कि यहाँ बताया गया है


1
मैं इसे 0:00:00 भाग के बिना कैसे प्राप्त करूं?
विक्की बी

@ विकीdelta = today - last_year print(delta.days)
डिबकी b

8
from datetime import datetime
start_date = datetime.strptime('8/18/2008', "%m/%d/%Y")
end_date = datetime.strptime('9/26/2008', "%m/%d/%Y")
print abs((end_date-start_date).days)

2
यह 4 साल पहले दिए गए उत्तरों की तुलना में कुछ भी नया नहीं जोड़ता है। -1।
मार्क अमेरी

+1 के उपयोग के लिए abs(), जो तब उपयोगी होता है जब तुलनात्मक तिथियां पहले से अज्ञात होती हैं और यह वह अंतर होता है जिसमें आप रुचि रखते हैं। यदि आपकी दूसरी तारीख datetime.strptime(date, date)पहली तारीख से बाद में है, तो परिणाम नकारात्मक होगा। abs()सभी इनपुट को पूर्ण बनाता है (यानी सकारात्मक)।
वीभत्स


6

लीब का उपयोग किए बिना सिर्फ शुद्ध कोड:

#Calculate the Days between Two Date

daysOfMonths = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def isLeapYear(year):

    # Pseudo code for this algorithm is found at
    # http://en.wikipedia.org/wiki/Leap_year#Algorithm
    ## if (year is not divisible by 4) then (it is a common Year)
    #else if (year is not divisable by 100) then (ut us a leap year)
    #else if (year is not disible by 400) then (it is a common year)
    #else(it is aleap year)
    return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0

def Count_Days(year1, month1, day1):
    if month1 ==2:
        if isLeapYear(year1):
            if day1 < daysOfMonths[month1-1]+1:
                return year1, month1, day1+1
            else:
                if month1 ==12:
                    return year1+1,1,1
                else:
                    return year1, month1 +1 , 1
        else: 
            if day1 < daysOfMonths[month1-1]:
                return year1, month1, day1+1
            else:
                if month1 ==12:
                    return year1+1,1,1
                else:
                    return year1, month1 +1 , 1
    else:
        if day1 < daysOfMonths[month1-1]:
             return year1, month1, day1+1
        else:
            if month1 ==12:
                return year1+1,1,1
            else:
                    return year1, month1 +1 , 1


def daysBetweenDates(y1, m1, d1, y2, m2, d2,end_day):

    if y1 > y2:
        m1,m2 = m2,m1
        y1,y2 = y2,y1
        d1,d2 = d2,d1
    days=0
    while(not(m1==m2 and y1==y2 and d1==d2)):
        y1,m1,d1 = Count_Days(y1,m1,d1)
        days+=1
    if end_day:
        days+=1
    return days


# Test Case

def test():
    test_cases = [((2012,1,1,2012,2,28,False), 58), 
                  ((2012,1,1,2012,3,1,False), 60),
                  ((2011,6,30,2012,6,30,False), 366),
                  ((2011,1,1,2012,8,8,False), 585 ),
                  ((1994,5,15,2019,8,31,False), 9239),
                  ((1999,3,24,2018,2,4,False), 6892),
                  ((1999,6,24,2018,8,4,False),6981),
                  ((1995,5,24,2018,12,15,False),8606),
                  ((1994,8,24,2019,12,15,True),9245),
                  ((2019,12,15,1994,8,24,True),9245),
                  ((2019,5,15,1994,10,24,True),8970),
                  ((1994,11,24,2019,8,15,True),9031)]

    for (args, answer) in test_cases:
        result = daysBetweenDates(*args)
        if result != answer:
            print "Test with data:", args, "failed"
        else:
            print "Test case passed!"

test()

3

सभी ने तिथि का उपयोग करते हुए उत्कृष्ट रूप से उत्तर दिया है, मुझे पांडा का उपयोग करके इसका उत्तर देने का प्रयास करें

dt = pd.to_datetime('2008/08/18', format='%Y/%m/%d')
dt1 = pd.to_datetime('2008/09/26', format='%Y/%m/%d')

(dt1-dt).days

यह जवाब देगा। यदि इनपुट में से एक डेटाफ्रेम कॉलम है। बस दिनों के स्थान पर dt.days का उपयोग करें

(dt1-dt).dt.days

2

एक datetime.toordinal()विधि भी है जिसका उल्लेख अभी तक नहीं किया गया था:

import datetime
print(datetime.date(2008,9,26).toordinal() - datetime.date(2008,8,18).toordinal())  # 39

https://docs.python.org/3/library/datetime.html#datetime.date.toordinal

date.toordinal ()

तिथि, जहां साल 1 जनवरी 1 किसी भी के लिए क्रमसूचक 1. है की proleptic ग्रेगोरियन क्रमसूचक लौटें dateवस्तु , date.fromordinal(d.toordinal()) == d

लगता है अच्छी तरह से दिनों के अंतर की गणना के लिए अनुकूल है, हालांकि के रूप में पठनीय नहीं है timedelta.days


1
ऐसे मामले हैं जिनमें यह दृष्टिकोण जीतता है। उदाहरण के लिए, 2019-07-09 23:50 और 2019-07-10 00:10 के बीच वास्तविक अंतर बीस मिनट है। (d1 - d0).daysलौटता है 0, d1.toordinal() - d0.toordinal()लौटता है 1। इस पर निर्भर करता है कि आपको अपने वास्तविक usecase में क्या चाहिए।
पीटर.ज़िक्लिक

यह दृष्टिकोण वास्तव में डेटाइम और तारीख की तुलना कर सकता है। उदाहरण के लिए अगर 2020-04-17 == 2020-04017 00:00:00
हैरी डुओंग

2

दिनांक और समय की गणना के लिए, कई विकल्प हैं लेकिन मैं सरल तरीका लिखूंगा:

from datetime import timedelta, datetime, date
import dateutil.relativedelta

# current time
date_and_time = datetime.datetime.now()
date_only = date.today()
time_only = datetime.datetime.now().time()

# calculate date and time
result = date_and_time - datetime.timedelta(hours=26, minutes=25, seconds=10)

# calculate dates: years (-/+)
result = date_only - dateutil.relativedelta.relativedelta(years=10)

# months
result = date_only - dateutil.relativedelta.relativedelta(months=10)

# days
result = date_only - dateutil.relativedelta.relativedelta(days=10)

# calculate time 
result = date_and_time - datetime.timedelta(hours=26, minutes=25, seconds=10)
result.time()

आशा है ये मदद करेगा


1

from datetime import date
def d(s):
  [month, day, year] = map(int, s.split('/'))
  return date(year, month, day)
def days(start, end):
  return (d(end) - d(start)).days
print days('8/18/2008', '9/26/2008')

यह, निश्चित रूप से, आपने पहले ही सत्यापित कर लिया है कि आपकी तिथियां प्रारूप में हैं r'\d+/\d+/\d+'


1
यह 8 साल पहले दिए गए उत्तरों की तुलना में कुछ भी नया नहीं जोड़ता है। -1।
मार्क अमेरी

1
मुख्य अंतर यह है कि ओपी के पास तार के रूप में उनकी तारीखों के बारे में जवाब देने के लिए ज्यादातर अंतर नहीं है। और जो लोग उस के लिए खाते थे वे बड़े पैमाने पर कड़ाई से आवश्यक से अधिक जटिल फॉर्मेटर्स का उपयोग करते थे। तो, मुख्य अंतर है map(int, s.split('/'))। बिल्कुल नहीं, लेकिन फिर यह सवाल बहुत बेवकूफ बुनियादी है। मेरा जवाब सिर्फ बिल्ली को त्वचा देने का एक और तरीका है।
पार्थियन ने

यह भी उल्लेख करते हुए कि तारीखें सही प्रारूप में हैं, और प्रथम-सन्निकटन सत्यापन regex दिया गया है। जो दूसरों ने नहीं किया।
पार्थियन ने

1

इस समस्या से निपटने के तीन तरीके इस प्रकार हैं:

from datetime import datetime

Now = datetime.now()
StartDate = datetime.strptime(str(Now.year) +'-01-01', '%Y-%m-%d')
NumberOfDays = (Now - StartDate)

print(NumberOfDays.days)                     # Starts at 0
print(datetime.now().timetuple().tm_yday)    # Starts at 1
print(Now.strftime('%j'))                    # Starts at 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.