Конвертировать двойное время в Python

У меня есть TimeField() в моих моделях Django. Я хочу преобразовать сумму записи этого в часы.

Вот фактический код на мой взгляд:

hours_week_decimal = Timesheet.objects.filter(owner = request.user.pk, week = datetime.datetime.now().isocalendar()[1]).aggregate(total=Sum('working_hour')) # this method return a dict of decimal
total_hours_week = convertDecimalToHours(hours_week_decimal)

и связанная функция:

def convertDecimalToHours(times):
    total_time = 0
    for k, v in times.items():
        total_time += int(v)
    print("type: {} - value: {}".format(type(total_time), total_time))

Это вернуло меня:

 type: int - value: 166000

У меня два часа

 Monday (08:30) and Tuesday(08:30)

Должно быть, это вернуло меня "17:00"

Надеюсь, вы можете помочь мне в решении этой проблемы:)

2 ответа

Проблема в том, что 30 м +30 м = 60 м, что да, это 1 ч, но вы ожидали, что калькулятор сможет понять, что вы хотите, 30+30 = 1 ч. Так что, в вашем случае, вы должны явно преобразовать 8:30 в 8,5

Быстрый, но не изящный подход к расширению вашего примера несколькими строками может быть следующим:

  • Конвертируйте ваши int ы в строки.
  • Вырежьте часы (позиции 0 и 1) и умножьте на 60, чтобы получить минуты.
  • Суммируйте этот результат в протоколе (позиции 2 и 3)

После того, как вы сделаете это для каждого имеющегося у вас TimeField, суммируйте все ваши времена, преобразованные в минутах, а затем пересчитайте в часы.

В вашем примере:

def convertDecimalToHours(times):
total_time = 0
for k, v in times.items():
    tmp_time = str(int(v))
    minutes = int(tmp_time[2:4]) + int(tmp_time[0:2])*60
    total_time += minutes / 60 # Now your 8:30 is 8.5
print("type: {} - value: {}".format(type(total_time), total_time))

Ваш результат здесь будет 17. Я предлагаю вам использовать это как пример, чтобы понять концепцию, а не как комплексное решение вашей проблемы.

Спасибо за Ваш ответ,

В моей базе данных у меня есть столбец типа "Время". Значение хранится так: 08:30:00.000000.

с моим предыдущим кодом переменные времени (переданные в параметрах) выглядят так:

{'total': Decimal ('166000.000000')}

Другие вопросы по тегам