首页 > 解决方案 > 确定连续小时块的开始和结束时间

问题描述

我有一个包含几个小时的 Python 列表。例如[7,8,9,10,17,23,1,2,3] ,小时采用 24 小时格式,范围从 0 到 23(0 = 午夜,23 = 晚上 11 点)。

我喜欢确定连续小时块的开始和结束时间。所以我想要的最终结果应该是一个列表,其中包含包含块开始和结束时间的字典。

尤其是确定从经过午夜(从 23 到 0)的块开始的块使得它变得困难。

期望的结果:

hour_blocks = (
            {
                "block_nr": 1,
                "block_start": 7,
                "block_end": 10
            },
            {
                "block_nr": 2,
                "block_start": 17,
                "block_end": 17
            },
            {
                "block_nr": 3,
                "block_start": 23,
                "block_end": 3
            }
        )

我从一个非常粗糙的版本开始,但我卡住了(见下文)。我也想不出任何可以使这更容易的 Python 库(例如 datetime 或 calendar 库)。

    i = 0
    busy_blocks = []
    hour_list = [7,8,9,10,17,23,1,2,3]

    start = False
    next_hour_connected = False

    for hour in hour_list:

        if hour == hour_list[i + 1] -1 and not start:
            # Next hour is connected and no start is defined
            busy_block_start = hour
            start = True
            continue

        if hour == hour_list[i + 1] - 1:
            # Next hour is still connected


            #if the subsequent hour is not connected, we define the block end
            if (hour != hour_list[i + 2] - 2) or next_hour_connected:
                busy_block_end = hour

                # Save block
                busy_blocks.append({
                    "busy_block_start": busy_block_start,
                    "busy_block_end": busy_block_end
                })

                # Reset block
                start = False
                next_hour_connected = False
            else:
                # Remember that next 
                next_hour_connected = True

标签: pythonnumpy

解决方案


好的,所以我不确定您提供的示例是否正确。因为你说的时间范围是0到23,所以“23, 1”不是连续的,除非是“23, 0”。

无论如何,我尝试实现一个简单的算法,它使用一个列表来临时存储连续的小时数。代码很长,而且绝对没有完全优化,但希望你能了解我在这里想要做什么。

hour_blocks = []
hour_list = [7,8,9,10,17,23,1,2,3]

hour_block= []

for i in range(len(hour_list)-1):
    hour = hour_list[i]
    nextHour = hour_list[i+1]
    #get current hour and next hour

    if (not hour_block): #if hour_block is empty, append the time
        hour_block.append(hour)

    if (hour==nextHour-1 or (hour==23 and nextHour==0)): #if hours were consecutive, append to hour_block
        hour_block.append(nextHour)
    else: #if not, add the first and the last element of the hour_block as the beginning time and end time
        hour_blocks.append({"begin":hour_block[0], "end":hour_block[-1]})
        hour_block = [] #clear the hour_block

    if i == len(hour_list)-2 and hour_block: #append hour_block to hour_blocks when loop is finished
        hour_blocks.append({"begin":hour_block[0], "end":hour_block[-1]})
        hour_block = []

print(hour_blocks) 
#prints [{'begin': 7, 'end': 10}, {'begin': 17, 'end': 17}, {'begin': 23, 'end': 23}, {'begin': 1, 'end': 3}]

Błotosmętek 的答案似乎也有效,因此您可能也想使用它(尽管您需要自己实现循环系统)

希望这有帮助,干杯:)


推荐阅读