Как найти количество дней между датами питон

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

Given two dates, Write a Python program to find the total number of days between them. 

Examples: 

Input : dt1 = 13/12/2018, dt2 = 25/2/2019
Output : 74 days

Input : dt1 = 01/01/2004, dt2 = 01/01/2005
Output : 366 days 

Naive Approach: One Naive Solution is to start from dt1 and keep counting the days till dt2 is reached. This solution requires more than O(1) time. 

A Better and Simple solution is to count the total number of days before dt1 from i.e., total days from 00/00/0000 to dt1, then count the total number of days before dt2. Finally, return the difference between the two counts.  

Python3

class Date:

    def __init__(self, d, m, y):

        self.d = d

        self.m = m

        self.y = y

monthDays = [31, 28, 31, 30, 31, 30,

             31, 31, 30, 31, 30, 31]

def countLeapYears(d):

    years = d.y

    if (d.m <= 2):

        years -= 1

    return int(years / 4) - int(years / 100) + int(years / 400)

def getDifference(dt1, dt2):

    n1 = dt1.y * 365 + dt1.d

    for i in range(0, dt1.m - 1):

        n1 += monthDays[i]

    n1 += countLeapYears(dt1)

    n2 = dt2.y * 365 + dt2.d

    for i in range(0, dt2.m - 1):

        n2 += monthDays[i]

    n2 += countLeapYears(dt2)

    return (n2 - n1)

dt1 = Date(13, 12, 2018)

dt2 = Date(25, 2, 2019)

print(getDifference(dt1, dt2), "days")

Time Complexity: O(1)
Auxiliary Space: O(1)

Using Python datetime module:

Python comes with an inbuilt datetime module that helps us to solve various datetime related problems. In order to find the difference between two dates we simply input the two dates with date type and subtract them, which in turn provides us the number of days between the two dates. 

Python3

from datetime import date

def numOfDays(date1, date2):

    return (date2-date1).days

date1 = date(2018, 12, 13)

date2 = date(2019, 2, 25)

print(numOfDays(date1, date2), "days")

Time Complexity: O(1)
Auxiliary Space: O(1)

One approach is to use the dateutil library, which provides a more convenient and flexible way of handling dates and times in Python. To install dateutil, you can use the following command:

pip install python-dateutil

To find the number of days between two dates using dateutil, you can use the rdelta function from the relativedelta module, as shown in the example below:

Python3

from dateutil import relativedelta

from datetime import datetime

date1 = datetime.strptime("13/10/2018", "%d/%m/%Y")

date2 = datetime.strptime("25/12/2018", "%d/%m/%Y")

difference = relativedelta.relativedelta(date2, date1)

print(difference.months, "months", difference.days, "days")

Time Complexity: O(1)
Auxiliary Space: O(1)

Method#4: Using time module

Approach 

this approach uses the date library in Python to convert the input strings to date objects, then calculates the difference between the two dates using the timedelta function, and finally returns the number of days in the timedelta object.

Algorithm

1. Convert the input strings to timestamp using time.mktime() method
2. Calculate the difference between the two timestamps
3. Convert the difference to days by dividing it with the number of seconds in a day (86400)
4. Return the number of days as integer

Python3

import time

def days_between_dates(dt1, dt2):

    date_format = "%d/%m/%Y"

    a = time.mktime(time.strptime(dt1, date_format))

    b = time.mktime(time.strptime(dt2, date_format))

    delta = b - a

    return int(delta / 86400)

dt1 = "13/12/2018"

dt2 = "25/2/2019"

print(days_between_dates(dt1, dt2))

Time Complexity: O(1) (time operations take constant time)
Space Complexity: O(1) (no extra data structures used)

Method#5: Using reduce from functools:

Algorithm:

  1. Import the required modules date from datetime and reduce from functools.
  2. Define a function numOfDays that takes two arguments date1 and date2.
  3. The function uses reduce to apply a lambda function to a list [date1, date2].
  4. The lambda function takes two arguments x and y and calculates the number of days between the two dates y-x.
  5. The final result is the number of days between date1 and date2.
  6. Assign date(2018, 12, 13) to date1 and date(2019, 2, 25) to date2.
  7. Call numOfDays function with date1 and date2 as arguments.
  8. Print the result along with the string “days”.

Python3

from datetime import date

from functools import reduce

def numOfDays(date1, date2):

    return reduce(lambda x, y: (y-x).days, [date1, date2])

date1 = date(2018, 12, 13)

date2 = date(2019, 2, 25)

print(numOfDays(date1, date2), "days")

Time complexity: O(n), where n is the number of dates between date1 and date2. In this case, since there are only two dates, the time complexity is constant.
Auxiliary Space: O(1). The function uses a constant amount of memory regardless of the size of the input dates.

Last Updated :
04 Apr, 2023

Like Article

Save Article

Из этого руководства вы узнаете, как посчитать количество дней между двумя датами в Python.

Мы будем использовать стандартную библиотеку datetime, которая позволит нам действительно легко работать с datetime объектами в Python.

Создание объекта Datetime

Поскольку datetime является встроенным модулем, мы можем сразу импортировать его.

from datetime import datetime

Создать объект datetime можно несколькими способами:

date_string = "1 January, 2021"

now = datetime.now() # получить текущую дату
dt1 = datetime(day=1, month=1, year=2021) # с заданными аргументами
dt2 = datetime.strptime(date_string, "%d %B, %Y") # из строки

Получить количество дней между датами в Python

Попытка посчитать количество дней между датами без использования модуля datetime, очень сложная задача — с учетом високосного года и количеством дней в каждом месяце (попытки создать собственную реализацию просто бессмысленна).

Мы можем просто вычесть datetime друг из друга, чтобы получить количество дней между ними:

from datetime import datetime

date1 = datetime.now()
date2 = datetime(day=1, month=12, year=2021)

timedelta = date2 - date1
print(timedelta)

Результат:

62 days, 10:11:33.887629

Если вам не нужны некоторые из этих показателей, можно конкретно указать, что вы хотите получить в результате: timedelta.days, timedelta.seconds или timedelta.microseconds:

now = datetime.now()
new_years = datetime(day=1, month=1, year=2022)
countdown = new_years - now

print('Сегодня: ', now)
print('Новый год наступит: ', new_years)
print('До нового года осталось дней: ', countdown.days)

Здесь мы создали timedelta объект countdown, и теперь мы может получить доступ к параметру days, чтобы узнать количество дней между new_years и now.

Результат:

Сегодня:  2021-09-29 14:43:49.218155
Новый год наступит:  2022-01-01 00:00:00
До нового года осталось дней:  93

Сложение и вычитание дней с помощью TimeDelta

Что, если вместо того, чтобы пытаться вычесть две известные даты друг из друга, вы захотите добавить или вычесть временные рамки?
Например, клиент подписался на услугу за ежемесячную плату, и через 30 дней нужно напомнить ему об этом.

Используя timedelta вы можете построить временную рамку для этих 30 дней, и вычитать ее из другого datetime объекта:

from datetime import datetime, timedelta

now = datetime.now()
thirty_days = timedelta(days=30)

print('Через 30 дней: ', now + thirty_days)
print('30 дней назад: ', now - thirty_days)

Результат:

Через 30 дней:  2021-10-29 14:28:43.208634
30 дней назад:  2021-08-30 14:28:43.208634

Это невероятно полезная функция при попытке реализовать планирование или получение записей из базы данных (например, информацию за последние 30 дней).

Заключение

В этом руководстве мы рассмотрели все, что вам нужно знать о получении количества дней между двумя датами в Python.

Время на прочтение
6 мин

Количество просмотров 34K

Python-программисту, при работе со значениями, представляющими дату и время, часто нужно вычислять длительность временных интервалов. Из этого материала вы узнаете о том, как находить разницу между двумя временными метками, выраженную в часах, минутах и секундах.

А именно, здесь мы коснёмся следующих вопросов:

  • Как пользоваться Python-модулем datetime для работы с датой и временем.
  • Что собой представляют объекты timedelta и что они могут дать программисту.
  • Как вычислять продолжительность временных интервалов, выражая результат в разных единицах измерения.

Python-модуль datetime

Для работы с датой и временем в Python используется модуль datetime. Он является частью стандартной библиотеки Python. Для того чтобы применить этот модуль в своём проекте — достаточно его импортировать:

import datetime

Для вычисления продолжительности временного интервала нужно создать две различных отметки времени. Тут есть несколько вариантов:

  • Два объекта date — стандартное представление даты.
  • Два объекта time — стандартное представление времени.
  • Два объекта datetime, комбинирующие сведения, которые обычно хранятся в объектах date и time.

Создание объектов date

Импортируем класс date из модуля datetime. Для того чтобы создать в Python объект date — можно воспользоваться обычной синтаксической конструкцией вида datetime.date(<year>,<month>,<day>). Вот пример создания объекта date с именем date1:

from datetime import date
date1 = datetime.date(2022,3,27)
print(date1)

# Вывод: 2022-03-27

Этот код можно попробовать запустить в онлайн-интерпретаторе Python на Geekflare. Ещё можно установить Python у себя.

Из предыдущего примера видно, что дата выводится в формате YYYY-MM-DD.

Обратите внимание на то, что при создании объекта date месяц надо задавать с использованием целого числа, в начале которого нет дополнительных нулей. Обычно в числовой записи месяцев соответствующие числа дополняют нулями. Здесь же, например, чтобы указать Июнь, то есть — 6 месяц — нужно воспользоваться числом 6, а не 06.

Попробуйте запустить следующий фрагмент кода. Тут месяц намеренно записан неправильно — 03 вместо 3. Из-за этого возникает ошибка SyntaxError:

date1 = datetime.date(2022,03,27)

print(date1)

# Сообщение об ошибке
File "<ipython-input-12-6eb72084e6ce>", line 1
    date1 = datetime.date(2022,03,27)
                                ^
SyntaxError: invalid token

Поговорим теперь о том, как создавать объекты time.

Создание объектов time

Для создания объектов time импортируем класс time. При создании таких объектов указывают следующие атрибуты класса: hour, minute, second и microsecond. Они, соответственно, позволяют указывать часы, минуты, секунды и микросекунды.

Правда, все эти атрибуты являются необязательными. Если какой-то из них опустить, предположим — second, то он, по умолчанию, будет установлен в 0.

В следующем примере показано создание объекта time с именем time1. Так же, как и при работе с объектами date, объекты time можно выводить в консоль:

from datetime import time
time1 = datetime.time(13,27,45,4600)
print(time1)

# Вывод: 13:27:45.004600

Создание объектов datetime

Как видите, объекты типа date не содержат сведений о времени. А в объектах time нет информации о дате.

Но на практике обычно нужны данные и о дате, и о времени. Поэтому вместо двух вышеописанных классов рекомендуется прибегнуть к классу datetime.

Обратиться к этому классу и создать соответствующий объект (dt1) можно так:

dt1 = datetime.datetime(2022,3,27,13,27,45,46000)
print(dt1)

# Вывод: 2022-03-27 13:27:45.046000

Создадим ещё один объект datetime и дадим ему имя dt2, опустив при его создании атрибут second. Это приведёт к тому, что он будет установлен в значение по умолчанию — 0.

dt2 = datetime.datetime(2022,6,30,14,28)
print(dt2)

# Вывод: 2022-06-30 14:28:00

Итак, теперь вы знаете о том, как создавать Python-объекты date, time и datetime, представляющие отметки времени. Пришло время поговорить о том, как находить длительность временных интервалов.

Применение объектов timedelta

В Python объекты timedelta представляют собой сведения о промежутках времени. Это — разница двух объектов date, time или datetime.

Если сложить или вычесть два объекта date, time или datetime, получится объект timedelta. У этого объекта имеются полезные атрибуты и методы, которые могут помочь в деле нахождения длительности временных интервалов.

Посчитаем длительность интервала, задаваемого двумя объектами типа datetimedt1 и dt2:

dt1 = datetime.datetime(2022,3,27,13,27,45,46000) 
dt2 = datetime.datetime(2022,6,30,14,28) 
tdelta = dt2 - dt1 
print(tdelta) 
print(type(tdelta)) 

# Вывод 
95 days, 1:00:14.954000 
<class 'datetime.timedelta'>

Видно, что переменная tdelta хранит разницу между dt1 и dt2. Тут, кроме того, пользуясь встроенной Python-функцией type(), мы проверили тип tdelta. Это — timedelta.

Проведём ещё один эксперимент.

Нахождение временного промежутка между двумя датами

Рассмотрим простой, но интересный пример.

Задача заключается в том, чтобы получить временную разницу между текущей датой (сегодняшним днём) и днём вашего рождения.

Для того чтобы её решить — надо сформировать первую отметку времени, указывающую на сегодняшний день, и вторую, указывающую на дату дня рождения.

Создадим пару объектов datetime:

  • Первый будет хранить сегодняшнюю дату, мы назовём его today.
  • Второй будет хранить дату дня рождения. Назовём его bday.

У класса datetime есть метод now(), который позволяет создавать объекты, содержащие сведения о текущем местном времени и дате. Воспользуемся этим методом для того чтобы получить сегодняшнюю дату, играющую роль точки отсчёта:

today = datetime.datetime.now()
print(today)

# Пример вывода: 2022-01-22 09:10:18.489538

Пробуя следующий код, замените значение, попадающее в bday, на дату своего дня рождения текущего года. Это позволит узнать о том, сколько времени вам ещё его ждать в этом году.

Если же ваш день рождения в этом году уже прошёл, можете записать в bday дату из следующего года.

bday = datetime.datetime(2022,8,30,11,59)
print(bday)

# Пример вывода: 2022-08-30 11:59:00

Следующий шаг нашей работы — нахождение разницы между двумя отметками времени. Её мы будем хранить в переменной time_diff. Подобные переменные, как мы уже говорили, имеют тип timedelta. Нам достаточно вычесть today из bday.

time_diff = bday - today
print(f"Your birthday is in {time_diff}")

# Вывод
Your birthday is in 220 days, 2:46:00.127416

Для того чтобы узнать о том, сколько полных дней осталось до дня рождения, можно воспользоваться атрибутом days объекта типа timedelta.

tdays = time_diff.days
print(f"Your birthday is in {tdays} days.")

# Вывод
Your birthday is in 220 days.

Выражение длительности временных промежутков в секундах

Теперь узнаем о том, сколько ждать дня рождения, выразив результат в секундах.

Для этого можно воспользоваться методом total_seconds() объекта типа timedelta. В следующем примере это — всё тот же объект time_diff.

tsecs = time_diff.total_seconds()
print(f"Your birthday is {tsecs} seconds away.")

# Вывод
Your birthday is 19017960.127416 seconds away.

Да, дня рождения придётся подождать!

Теперь вы знаете о том, как вычислять промежутки времени и выражать их в секундах.

Давайте вспомним то, что мы знаем о времени, и поговорим об измерении времени в днях, часах, минутах и секундах. В сутках 24 часа, в часе 60 минут, а 60 секунд — это минута.

Часы, минуты и секунды

Для перехода от секунд к минутам, дням или часам, можно воспользоваться следующей таблицей, деля значение в секундах на соответствующий коэффициент преобразования.

Воспользуемся этими знаниями.

Выражение длительности временных промежутков в минутах

Для того чтобы, имея данные о длительности промежутка времени, выраженные в секундах, узнать его длительность в минутах, нужно разделить общее число секунд на 60.

Разделим то, что хранится в переменной tsecs, на 60, и сохраним то, что получится, в переменной tmins:

tmins = tsecs/60
print(f"Your birthday is {tmins} minutes away.")

# Вывод
Your birthday is 316966.0021236 minutes away.

Выражение длительности временных промежутков в часах

Теперь посчитаем длительность временного промежутка, выраженную в часах. Учитывая то, что у нас уже есть значение, выраженное в минутах, для достижения этой цели его можно просто поделить на 60. Или можно поделить значение, выраженное в секундах, на 3600 (60*60).

thrs = tsecs/(60*60)
print(f"Your birthday is {thrs} hours away.")

# Вывод
Your birthday is 5282.76670206 hours away.

Теперь вы знаете о том, как представлять разные промежутки времени в нужном вам виде.

Итоги

Освоив это руководство, вы узнали следующее:

  • Как создавать объекты, содержащие сведения о дате и времени, пользуясь модулем datetime, и как работать с такими объектами.
  • Как пользоваться объектами типа timedelta для нахождения длительности временных промежутков или разницы между двумя объектами, содержащими сведения о дате или времени.
  • Как выражать длительность временных промежутков в секундах, минутах и часах.

Надеюсь, вам пригодится то, о чём вы узнали. Теперь эти знания вполне можно применить на практике.

Какие задачи вы решаете с помощью Python?

After reading this article, you’ll learn how to find the difference between two dates in Python. Also, we’ll see how to calculate the number of days between two dates and datetime objects.

Table of contents

  • How to Calculate Difference Between Two Dates in Days
    • Example: Days between two dates
  • Difference between two date object
  • Difference between two datetime object

How to Calculate Difference Between Two Dates in Days

Dates can be in any form, such as string, date object, or datetime object. we will see the example of all cases.

Python provides the datetime module to create and manipulate the date and time. The below steps show how to use the datetime module to calculate the difference between two dates in days.

  1. Import datetime module

    Python datetime module provides various functions to create and manipulate the date and time. Use the from datetime import datetime statement to import a datetime class from a datetime module.

  2. Convert date string to a datetime object

    There may be a case in which dates are in a string format. Before calculating the difference in days, we need to convert both date strings to a datetime object.
    Use the strptime(date_str, format) function to convert a date string into a datetime object as per the corresponding format.
    The format codes are standard directives for mentioning the format of the string for parsing. For example, the %Y/%m/%d format codes are for yyyy-mm-dd

  3. Subtract the date2 from date1

    To get the difference between two dates, subtract date2 from date1. A result is a timedelta object. The timedelta represents a duration which is the difference between two dates, time, or datetime instances, to the microsecond resolution.

  4. Get a difference in days

    To get the number of days between two dates, use the timedelta.days attribute

  5. Get the difference in seconds

    To get a result in seconds, use the timedelta.seconds attribute

Example: Days between two dates

from datetime import datetime

# dates in string format
str_d1 = '2021/10/20'
str_d2 = '2022/2/20'

# convert string to date object
d1 = datetime.strptime(str_d1, "%Y/%m/%d")
d2 = datetime.strptime(str_d2, "%Y/%m/%d")

# difference between dates in timedelta
delta = d2 - d1
print(f'Difference is {delta.days} days')

Output:

Difference is 123 days

Shortcode:

from datetime import datetime as dt

res = (dt.strptime('2022/2/20', "%Y/%m/%d") - dt.strptime('2021/10/20', "%Y/%m/%d")).days

Also, see:

  • Difference between the two dates in months.
  • Time Difference between two-time in Python.
  • Calculate the business days between two dates in Python.

Difference between two date object

There are cases in which you receive dates in a date object instead of a string. In such cases, you can directly calculate the difference between them by performing the subtraction operation.

Example:

from datetime import date

def get_difference(date1, date2):
    delta = date2 - date1
    return delta.days

d1 = date(2021, 10, 20)
d2 = date(2022, 2, 20)
days = get_difference(d1, d2)
print(f'Difference is {days} days')

Output:

Difference is 123 days

Difference between two datetime object

We need to work with a datetime object instead of a date in some cases. The datetime object contains both date (year-month-day) and time (hours-minutes-seconds) information. Let’s see how to calculate the number of days between two datetime objects.

  • First, convert a datetime string to a datetime object using the strptime() function
  • Next, calculate the difference by subtracting datetime1 from datetime2.

Example:

from datetime import datetime

# datetime in string format
str_dt1 = '2021/10/20 09:15:32.36980'
str_dt2 = '2022/2/20 04:25:42.120450'

# convert string to datetime
dt1 = datetime.strptime(str_dt1, "%Y/%m/%d %H:%M:%S.%f")
dt2 = datetime.strptime(str_dt2, "%Y/%m/%d %H:%M:%S.%f")

# difference between datetime in timedelta
delta = dt2 - dt1
print(f'Difference is {delta.days} days')

Output:

Difference is 122 days

Note:

The Python timedelta object considers 24 hours as one day, and For calendar days, you’ll need to round down to the nearest day by removing the partial day on both sides. I.e., we need to set hour, minute, and seconds to zero in both datetime.

Example:

from datetime import datetime

# datetime in string format
str_dt1 = '2021/10/20 09:15:32.36980'
str_dt2 = '2022/2/20 04:25:42.120450'

# convert string to datetime
dt1 = datetime.strptime(str_dt1, "%Y/%m/%d %H:%M:%S.%f")
dt2 = datetime.strptime(str_dt2, "%Y/%m/%d %H:%M:%S.%f")

rounded_dt1 = dt1.replace(hour=0, minute=0, second=0, microsecond=0)
rounded_dt2 = dt2.replace(hour=0, minute=0, second=0, microsecond=0)
delta = (rounded_dt2 - rounded_dt1)
print(delta.days)

Python Exercises and Quizzes

Free coding exercises and quizzes cover Python basics, data structure, data analytics, and more.

  • 15+ Topic-specific Exercises and Quizzes
  • Each Exercise contains 10 questions
  • Each Quiz contains 12-15 MCQ

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Не поддерживается на вашем устройстве google play как исправить samsung
  • Составь рассказ если бы я видел в темноте как филин имел панцирь как черепаха
  • Как найти постоянную мощность двигателя постоянного тока
  • Как найти место в купейном вагоне
  • Как найти в строке максимальную подстроку

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии