Как рассчитать количество дней между двумя заданными датами
Заголовок: Как посчитать количество дней между двумя датами в Python?
Описание проблемы:
У меня есть две даты, например, '8/18/2008'
и '9/26/2008'
. Какой лучший способ получить количество дней между этими двумя датами в Python? Я хотел бы знать, какие библиотеки или функции могут помочь в этом, и есть ли какие-то особенности, о которых нужно помнить при работе с датами.
5 ответ(ов)
Для вычисления числа дней между двумя датами в 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
.
Каждый отлично ответил, используя даты, давайте я попробую ответить с помощью 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
Ваш код почти правильный, но у вас есть небольшая ошибка в использовании функции 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
, и разность всегда будет положительной.
Это также можно легко сделать с помощью библиотеки arrow
:
import arrow
a = arrow.get('2017-05-09')
b = arrow.get('2017-05-11')
delta = (b - a)
print(delta.days)
Для справки: документация arrow
Вот пример кода на 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
реализуют логику вычисления количества дней между двумя датами, учитывая високосные года и переходы между месяцами. Тестовая функция проверяет корректность работы программы на нескольких тестовых случаях.
Преобразование даты в datetime в Python
Как получить день недели по заданной дате?
Добавление дней к дате в Python
Как вывести дату в стандартном формате?
Итерация по диапазону дат в Python