If I have two dates (ex. `'8/18/2008'`

and `'9/26/2008'`

), what is the best way to get the number of days between these two dates?

# python – How to calculate number of days between two given dates?

## The Question :

*550 people think this question is useful*

*The Question Comments :*

## The Answer 1

*868 people think this answer is useful*

If you have two date objects, you can just subtract them, which computes a `timedelta`

object.

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

The relevant section of the docs: https://docs.python.org/library/datetime.html.

See this answer for another example.

## The Answer 2

*171 people think this answer is useful*

Using the power of datetime:

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

## The Answer 3

*39 people think this answer is useful*

Days until Christmas:

>>> import datetime >>> today = datetime.date.today() >>> someday = datetime.date(2008, 12, 25) >>> diff = someday - today >>> diff.days 86

More arithmetic here.

## The Answer 4

*18 people think this answer is useful*

You want the datetime module.

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

Another example:

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

As pointed out here

## The Answer 5

*11 people think this answer is useful*

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)

## The Answer 6

*9 people think this answer is useful*

It also can be easily done with `arrow`

:

import arrow a = arrow.get('2017-05-09') b = arrow.get('2017-05-11') delta = (b-a) print delta.days

For reference: http://arrow.readthedocs.io/en/latest/

## The Answer 7

*7 people think this answer is useful*

without using Lib just pure code:

#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()

## The Answer 8

*7 people think this answer is useful*

everyone has answered excellently using the date, let me try to answer it using pandas

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

This will give the answer.
In case one of the input is dataframe column. simply use **dt.days** in place of **days**

(dt1-dt).dt.days

## The Answer 9

*4 people think this answer is useful*

There is also a `datetime.toordinal()`

method that was not mentioned yet:

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()Return the proleptic Gregorian ordinal of the date, where January 1 of year 1 has ordinal 1. For any

`date`

objectd,`date.fromordinal(d.toordinal()) == d`

.

Seems well suited for calculating days difference, though not as readable as `timedelta.days`

.

## The Answer 10

*4 people think this answer is useful*

For calculating dates and times, there are several options but I will write the simple way:

from datetime import timedelta, datetime, date import dateutil.relativedelta # current time date_and_time = datetime.now() date_only = date.today() time_only = datetime.now().time() # calculate date and time result = date_and_time - 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 - timedelta(hours=26, minutes=25, seconds=10) result.time()

Hope it helps

## The Answer 11

*2 people think this answer is useful*

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

This assumes, of course, that you’ve already verified that your dates are in the format `r'\d+/\d+/\d+'`

.

## The Answer 12

*2 people think this answer is useful*

Here are three ways to go with this problem :

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

## The Answer 13

*1 people think this answer is useful*

Without using datetime object in python.

# A date has day 'd', month 'm' and year 'y' class Date: def __init__(self, d, m, y): self.d = d self.m = m self.y = y # To store number of days in all months from # January to Dec. monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ] # This function counts number of leap years # before the given date def countLeapYears(d): years = d.y # Check if the current year needs to be considered # for the count of leap years or not if (d.m <= 2) : years-= 1 # An year is a leap year if it is a multiple of 4, # multiple of 400 and not a multiple of 100. return int(years / 4 - years / 100 + years / 400 ) # This function returns number of days between two # given dates def getDifference(dt1, dt2) : # COUNT TOTAL NUMBER OF DAYS BEFORE FIRST DATE 'dt1' # initialize count using years and day n1 = dt1.y * 365 + dt1.d # Add days for months in given date for i in range(0, dt1.m - 1) : n1 += monthDays[i] # Since every leap year is of 366 days, # Add a day for every leap year n1 += countLeapYears(dt1) # SIMILARLY, COUNT TOTAL NUMBER OF DAYS BEFORE 'dt2' n2 = dt2.y * 365 + dt2.d for i in range(0, dt2.m - 1) : n2 += monthDays[i] n2 += countLeapYears(dt2) # return difference between two counts return (n2 - n1) # Driver program dt1 = Date(31, 12, 2018 ) dt2 = Date(01, 01, 2019 ) print(getDifference(dt1, dt2), "days")