#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)