用于计算给定使用时间的空闲时间的数据结构

2024-06-17 13:33:43 发布

您现在位置:Python中文网/ 问答频道 /正文

序言:我有一个有一百个停车位的停车场。我将预订存储为针对指定空间的自由格式开始和结束时间。目前,我们允许人们查询停车场的具体时间,并可以很容易地告诉他们是否有空闲空间。但我现在有一个要求,那就是在5天的时间里,从7点到7点,每1小时有多少空闲空间。使用现有的查询意味着我需要执行60个查询,这对于交互来说太慢了,对于非交互来说似乎太难了

因此,我正在寻找一种方法来映射预订之间的时间,然后将其强制转换为插槽可用性,我可以单独存储。这个过程本身可能有点混乱,但它也可能使查询数据库以获取特定可用性的速度加快

我想做的是定义一天,然后“减去”当天的预订,并留下一个围绕这些预订的可用时间范围列表,然后我可以继续强制进入一小时的时段

我自己做了一半,从一个给定的时间开始,一直到第一次预订,跳到最后,然后重复,直到我到达最后一个位置,但这是非常无聊的事情,我很难相信这以前从未做过。我正在使用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))]

我意识到,我可能已经进入了一个特定的阶段,这可能只会让我受益,但这种时间间隔和分割的想法正是我需要帮助的地方。有什么想法吗


Tags: 方法todaydatetimetime格式时间空间空闲
2条回答

如果您只想知道“在5天的时间跨度内,7-7小时的时段有多少个可用空间”,那么我的建议是:

  • 1小时插槽空间的数量为12*5*100=6000。设置一些计数器 到6000
  • 每次进行新预订时(假设1小时
    预订,仅从整小时开始)减少计数器
  • 每满一小时运行一次查询,以检查结束了多少预订 和增量计数器

每次您都可以执行一个查询来检查您有多少可用空间

你能创建所有的小时时段并删除使用过的时段吗

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

相关问题 更多 >