Python: часы между двумя датами дня - PullRequest
0 голосов
/ 10 сентября 2018

Я пытался разработать функцию Python, которая определяет разницу между двумя datetime объектами. Мне нужен алгоритм, который рассчитывает количество часов в день. Есть ли для этого встроенная функция?

from datetime import datetime, timedelta, date

def getHoursByDay(dateA, dateB):
    ...

dateA = datetime.strptime('2018-09-01 09:00:00', '%Y-%m-%d %H:%M:%S')
dateB = datetime.strptime('2018-09-03 11:30:00', '%Y-%m-%d %H:%M:%S')

hours = getHoursByDay(dateA, dateB)

print hours

# {
#   '2018-09-01': 15,
#   '2018-09-02': 24,
#   '2018-09-03': 11.5,
# }

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Встроенной функции нет, хотя ее очень просто построить.

from datetime import datetime, timedelta, time

def deltaByDay(dateA, dateB):
    dateAstart = datetime.combine(dateA, time())
    dateBstart = datetime.combine(dateB, time())
    result = {}
    oneday = timedelta(1)
    if dateAstart == dateBstart:
        result[dateA.date()] = dateB - dateA
    else:
        nextDate = dateAstart + oneday
        result[dateA.date()] = nextDate - dateA
        while nextDate < dateBstart:
            result[nextDate.date()] = oneday
            nextDate += oneday
        result[dateB.date()] = dateB - dateBstart
    return result

def deltaToHours(delta, ndigits=None):
    return delta.days * 24 + round(delta.seconds / 3600.0, ndigits)

dateA = datetime.strptime('2018-09-01 09:00:00', '%Y-%m-%d %H:%M:%S')
dateB = datetime.strptime('2018-09-03 11:30:00', '%Y-%m-%d %H:%M:%S')
deltas = deltaByDay(dateA, dateB);
output = {k.strftime('%Y-%m-%d'): deltaToHours(v, 1) for k, v in deltas.items()}
print(output)
# => {'2018-09-01': 15.0, '2018-09-02': 24.0, '2018-09-03': 11.5}
0 голосов
/ 10 сентября 2018

Встроенные функции timedelta помогут вам узнать общее количество дней и разницу в оставшихся часах. Если вы хотите, чтобы выходные данные были представлены в формате словаря, вам нужно будет создать их вручную следующим образом:

from datetime import datetime, time, timedelta

def getHoursByDay(dateA, dateB):
    if dateA.strftime("%Y-%m-%d") == dateB.strftime("%Y-%m-%d"):
        return {dateA.strftime("%Y-%m-%d"): abs(b-a).seconds / 3600} 
    result = {}
    delta = dateB - dateA
    tomorrow = dateA + timedelta(days=1)
    day1 = datetime.combine(tomorrow, time.min) - dateA
    result[dateA.strftime("%Y-%m-%d")] = day1.seconds / 3600
    for day in range(1, delta.days):
        result[(dateA + timedelta(days=day)).strftime("%Y-%m-%d")] = 24
    priorday = dateB - timedelta(days1)
    lastday = dateB - datetime.combine(priorday, time.min)
    result[dateB.strftime("%Y-%m-%d")] = lastday.seconds / 3600
    return result

По сути, эта функция вычисляет значения первого дня и последнего дня, а затем заполняет все дни между 24.

0 голосов
/ 10 сентября 2018

Существует простой способ сделать это.

hours = (dateA - dateB).hours

Я использовал это, чтобы рассчитать разницу в днях.

https://docs.python.org/2/library/datetime.html#datetime.timedelta

...