Попытка написать временную дельта-функцию

#python #datetime

#python #дата и время

Вопрос:

Я пытаюсь написать функцию на python, с помощью которой я могу ввести время начала и время окончания, и она вернет общее количество часов.

В настоящее время я смог написать функцию, в которую я ввожу, например (’07:30:00′, ’12:00:00′) и он возвращает 4.5

Однако я хочу иметь возможность импортировать список. Например,

(’07:30:00, 08:30:00′, ’12:00:00, 12:00:00′) и пусть он вернет 4.5, 3.5 и т.д….

Как мне изменить свой код, чтобы я мог это сделать?

Спасибо

Я возился часами, но я очень новичок в python, поэтому не знаю, как продвигаться дальше

 def compute_opening_duration(opening_time, closing_time):
    while True:
        try:
            FORMAT = '%H:%M:%S'
            tdelta = datetime.strptime(closing_time, FORMAT) - datetime.strptime(opening_time, FORMAT)
            tdelta_s = tdelta.total_seconds()
            tdelta_m = tdelta_s/60
            tdelta_h = tdelta_m/60
            print(tdelta_h)
            break
        except ValueError:
            print('-1')
            break
  

Комментарии:

1. Дополнительные параметры означают дополнительные проверки. Вы передаете несколько раз в одном параметре, поэтому вы должны разделить их. opening_time.split(',') выполнит эту работу. Он разобьет строку на n частей на основе разделителя. Доступ к ним по индексу, это будет просто простой список.

Ответ №1:

Передайте массив в качестве параметра функции. Проверьте, имеет ли массив времени открытия ту же длину, что и длина массива времени закрытия. Объявите результирующий массив в строке, в которой вы вычисляете tdelta, который вы должны добавить в результирующий массив.

 def compute_opening_duration(opening_time_arr, closing_time_arr):
    if len(opening_time_arr) != len(closing_time_arr):
        return
    resultTime = []
    for idx, closing_timein enumerate(closing_time_arr) :
            try:
                FORMAT = '%H:%M:%S'
                tdelta = datetime.strptime(closing_time, FORMAT) - 
    datetime.strptime(opening_time_arr[idx], FORMAT)
                resultTime.append(tdelta)
                tdelta_s = tdelta.total_seconds()
                tdelta_m = tdelta_s/60
                tdelta_h = tdelta_m/60
                #print(tdelta_h)
            except ValueError:
                pass   
            #print('-1')
    return resultTime
  

Комментарии:

1. Как я могу получить результат и сохранить его как np.array БЕЗ печати функции в фоновом режиме. Я пытаюсь определить array = np.array(compute_blah_blah), но он продолжает печатать.

2. Вы запрашиваете функцию печати? Или другое?

3. Я хотел бы распечатать ее позже, как только я преобразовал ее в массив. Я попытался Return вместо print, но это возвращает ошибки

4. В операторе if допущена ошибка. Кроме того, я меняю функцию печати на передачу. Какой тип ошибки у вас есть и в какой строке кода?

5. Ошибок нет, код работает отлично. Однако я хочу преобразовать ее в массив.

Ответ №2:

Если я правильно понял вопрос

 def compute_opening_duration(time_list):
    # convert to datetime: 
    FORMAT = '%H:%M:%S'
    time_list = [datetime.strptime(time, FORMAT) for time in time_list]

    # compute and return deltas
    return [(close_time-open_time).total_seconds()/3600 
            for open_time, close_time in zip(time_list[:-1], time_list[1:])


  

Комментарии:

1. Умный подход. Для меня это выглядит великолепно. Один вопрос, можете ли вы уточнить, как zip здесь работает функция? Спасибо!

2. Спасибо! zip создает генератор, который выводит пары последовательных времен из time_list путем сопряжения элементов с индексами 0, …, n-2 с индексами (1, …, n-1) соответственно (два понимания списка во входных данных zip)