7

Как рассчитать количество дней между двумя заданными датами

32

Заголовок: Как посчитать количество дней между двумя датами в Python?

Описание проблемы:

У меня есть две даты, например, '8/18/2008' и '9/26/2008'. Какой лучший способ получить количество дней между этими двумя датами в Python? Я хотел бы знать, какие библиотеки или функции могут помочь в этом, и есть ли какие-то особенности, о которых нужно помнить при работе с датами.

5 ответ(ов)

2

Для вычисления числа дней между двумя датами в Python с использованием модуля datetime, вы можете воспользоваться следующим подходом:

from datetime import datetime

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

# Преобразуем строки с датами в объекты datetime
a = datetime.strptime('8/18/2008', date_format)
b = datetime.strptime('9/26/2008', date_format)

# Находим разницу между датами
delta = b - a

# Выводим количество дней между датами
print(delta.days)

# Вот и всё, как вычислить количество дней между двумя заданными датами

В этом коде мы используем метод strptime для парсинга строк, содержащих даты, в объекты datetime. После этого просто вычитаем одну дату из другой, получая объект timedelta, который содержит информацию о разнице между датами, включая количество дней, которые можно получить через атрибут days.

0

Каждый отлично ответил, используя даты, давайте я попробую ответить с помощью 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

Это даст вам нужный ответ. Если одним из входных значений является столбец датафрейма, просто используйте dt.days вместо days:

(dt1 - dt).dt.days
0

Ваш код почти правильный, но у вас есть небольшая ошибка в использовании функции abs(). Вместо этого в Python 3 нужно использовать встроенную функцию abs() для получения абсолютного значения. Кроме того, вы можете использовать атрибут .days объекта timedelta, который возвращает разницу между двумя датами. Вот исправленный вариант вашего кода:

from datetime import datetime

start_date = datetime.strptime('8/18/2008', "%m/%d/%Y")
end_date = datetime.strptime('9/26/2008', "%m/%d/%Y")

# Вычисляем разницу в днях
difference = (end_date - start_date).days
# Выводим абсолютное значение разности
print(abs(difference))

Этот код правильно вычисляет количество дней между двумя датами и отображает результат. Обратите внимание, что использование abs() здесь не обязательно, поскольку end_date находится позже, чем start_date, и разность всегда будет положительной.

0

Это также можно легко сделать с помощью библиотеки arrow:

import arrow

a = arrow.get('2017-05-09')
b = arrow.get('2017-05-11')

delta = (b - a)
print(delta.days)

Для справки: документация arrow

0

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

# Вычисление дней между двумя датами

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

def isLeapYear(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) or (y1 == y2 and m1 > m2) or (y1 == y2 and m1 == m2 and d1 > d2):
        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

# Тестовые случаи
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("Тест с данными:", args, "не пройден")
        else:
            print("Тест прошел успешно!")

test()

В данном коде функции isLeapYear, Count_Days и daysBetweenDates реализуют логику вычисления количества дней между двумя датами, учитывая високосные года и переходы между месяцами. Тестовая функция проверяет корректность работы программы на нескольких тестовых случаях.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь