1

時間追跡アプリケーションの場合、1 日は 5 つのセクションに分割されます。

0:00~6:00、6:00~14:00、14:00~20:00、20:00~23:00、23:00~(無限)

これらの 5 つの「ビン」は、これらのいずれかに費やされた時間に応じて満たされる必要があります。たとえば、問題の間隔が 5:00 に始まり 16:00 に終わる場合、ビン #1 には 1 時間が含まれ、ビン #2 には 8 時間が含まれ、ビン #3 には 2 時間が含まれ、ビン #4 には 0 時間が含まれ、ビン #5 には次の時間が含まれます。 0時間。23:00 を超える時間は、ビン #5 に入ります。

これまでのところ、私はこれを思いつきました:

    sections = [ 0, 0, 0, 0, 0 ]
    for tframe in numericdata:
        if tframe[0] < 6.00: # starts before 6:00
            if tframe[1] >= 6.00: # ends after 6:00
                sections[0] += 6.00 - tframe[0]
            else: # ends before 6:00
                sections[0] += tframe[1] - tframe[0]
                continue

            if tframe[1] >= 14.00: # ends after 14:00
                sections[1] += 14.00 - 6.00
            else: # ends between 6:00 and 14:00
                sections[1] += tframe[1] - 6.00
                continue

            if tframe[1] >= 20.00: # ends after 20:00
                sections[2] += 20.00 - 14.00
            else: # ends between 14:00 and 20:00
                sections[2] += tframe[1] - 14.00
                continue

            if tframe[1] >= 23.00: # ends after 23:00
                sections[3] += 23.00 - 20.00
                sections[4] += tframe[1] - 23.00
            else: # ends between 20:00 and 23:00
                sections[3] += tframe[1] - 20.00
                continue

        elif tframe[0] < 14.00: # starts between 6:00 and 14:00
            if tframe[1] >= 14.00: # ends after 14:00
                sections[1] += 14.00 - tframe[0]
            else: # ends before 14:00
                sections[1] += tframe[1] - tframe[0]
                continue

            if tframe[1] >= 20.00: # ends after 20:00
                sections[2] += 20.00 - 14.00
            else: # ends between 14:00 and 20:00
                sections[2] += tframe[1] - 14.00
                continue

            if tframe[1] >= 23.00: # ends after 23:00
                sections[3] += 23.00 - 20.00
                sections[4] += tframe[1] - 23.00
            else: # ends between 20:00 and 23:00
                sections[3] += tframe[1] - 20.00
                continue

        elif tframe[0] < 20.00: # starts between 14:00 and 20:00
            if tframe[1] >= 20.00: # ends after 20:00
                sections[2] += 20.00 - tframe[0]
            else: # ends before 20:00
                sections[2] += tframe[1] - tframe[0]
                continue

            if tframe[1] >= 23.00: # ends after 23:00
                sections[3] += 23.00 - 20.00
                sections[4] += tframe[1] - 23.00
            else: # ends between 20:00 and 23:00
                sections[3] += tframe[1] - 20.00
                continue

        elif tframe[0] < 23.00: # starts between 20:00 and 23:00
            if tframe[1] >= 23.00: # ends after 23:00
                sections[3] += 23.00 - tframe[0]
                sections[4] += tframe[1] - 23.00
            else: # ends before 23:00
                sections[3] += tframe[1] - tframe[0]
                continue

        else: # starts and ends some time after 23:00
            sections[4] += tframe[1] - tframe[0]

numericdata間隔を開始時間と終了時間のタプルとして含む配列です。すべての時間値は分数を使用して時間に変換されているため、13:15 は 13.25 などにエンコードされます。例として、numericdataが含まれている可能性が[ [ 6.75, 12.5 ], [ 13.5, 18.25 ] ]あるため、2 つの間隔 (1 つは 6:45 から 12:30 まで、もう 1 つは 13:30 から 13:30 から) 18:15。結果のsections配列は次のようになります。[ 0, 6.25, 4.25, 0, 0 ]

私が思いついたものよりも、これを行うためのより良い方法があるに違いないと感じています。それは完全にハードコーディングされており、コードの重複を減らす何かを構築することはできません。おそらく、そのようにハードコーディングするのではなく、ビンの量とその長さを定義するなど、もう少し柔軟です。

前もって感謝します!

4

1 に答える 1