конвертировать двойное время в Python - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть 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 ]

0 голосов
/ 27 ноября 2018

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

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

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

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

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

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. Я предлагаю вам использовать это как пример, чтобы понять концепцию, а не как комплексное решение вашей проблемы.

0 голосов
/ 27 ноября 2018

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

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

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

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

...