Структура данных для выработки свободного времени с учетом использованного времени - PullRequest
0 голосов
/ 17 января 2020

Преамбула: у меня есть автостоянка с сотней мест. Я сохраняю резервирование как время начала и окончания произвольной формы для указанных пробелов. В настоящее время мы разрешаем людям запрашивать парковку в течение определенного времени c и можем легко сказать им, есть ли свободное место. Но теперь у меня есть требование рекламировать количество свободных мест для 1-часовых интервалов с 7 по 7 на 5 дней. Использование существующего запроса означало бы, что мне нужно выполнить 60 запросов, что слишком медленно для интерактивного выполнения и кажется слишком сложным, чтобы выполнять его не интерактивно.

Поэтому я ищу способ сопоставить время между бронированием , а затем приведите это в наличие слотов, которые я могу хранить отдельно. Этот процесс может быть немного заторможен сам по себе, но он может также сделать запрос к базе данных для определения доступности c несколько быстрее.

Что я хочу сделать, это определить день, а затем «вычесть» заказы на этот день и у меня останется список доступных диапазонов времени вокруг этих бронирований, которые я затем смогу go перевести в часовые интервалы.

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

today = Day(start=datetime.time(7), end=datetime.time(19))
print(today.ranges)
# [(datetime.time(7), datetime.time(19))]

day.subtract(datetime.time(12), datetime.time(13))
print(today.ranges)  
# [(datetime.time(7), datetime.time(12)), (datetime.time(13), datetime.time(19))]

Я понимаю, что я, вероятно, перехожу на уровень специфичности, где это может только принести мне пользу, но эта идея ранжирования и разделения времени - вот где мне нужна помощь. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Если вы хотите знать только " сколько свободных мест имеется для 1-часовых интервалов из 7-7, для промежутка в 5 дней", тогда мое предложение:

  • количество интервалов в 1-часовой интервал равно 12 * 5 * 100 = 6000. Установите для какого-либо счетчика значение 6000
  • каждый раз, когда выполняется новое резервирование (при условии, что резервирование составляет 1 час
    , начиная только с полных часов), уменьшайте счетчик
  • на каждый полный час выполнения запроса. чтобы проверить, сколько резервирований закончилось, и увеличить счетчик

Каждый раз вы можете выполнить один запрос, чтобы проверить, сколько у вас свободных мест.

0 голосов
/ 17 января 2020

Можете ли вы создать все часовые слоты и удалить использованные?

def create_hour_slots(start, end):
    return list(zip(range(start, end), range(start+1, end+1)))

today = create_hour_slots(7, 19)
today
[(7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 19)]

def remove_range(start_subtract, end_subtract, day_range):
    slots_to_remove = create_hour_slots(start_subtract, end_subtract)
    availability = [r in day_range for r in slots_to_remove]
    if not all(availability):
        unavailable = [r for r in slots_to_remove if r not in day_range]
        print("Unavailable slots: {}".format(unavailable))
        return False
    remaining_range = [s for s in day_range if s not in slots_to_remove]
    return remaining_range

remove_noon_slot = remove_range(12, 13, today)
remove_noon_slot
[(7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (13, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 19)]
remove_unavailable_slot = remove_range(6, 8, today)
Unavailable slots: [(6, 7)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...