Конвертировать двойное время в 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')}