如何在Python中表示两个特定日期时间之间的周期?

2022-09-28 20:32:41 发布

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

有没有一个Pythonic的方法来表示,作为一个单一的对象,两个给定的datetime之间的周期?他们之间的时间量(aka。timedelta),但实际时间段,例如datetime(2000, 1, 1)(包含)和datetime(2000, 1, 2, hour=6)(排除)之间的时间段。用例是我需要取一堆开始和结束datetime并将它们连接在一起,创建一组表示所有输入的最小的非重叠周期。我知道如何做到这一点,但我不知道在Python中是否有一种方便的方法,例如我可以很容易地连接句点,如下所示:

first_start = datetime(2000, 1, 1)
first_end = datetime(2000, 1, 2, hour=6)
first = period(first_start, first_end)
second_start = datetime(2000, 1, 1, hour=3)
second_end = datetime(2000, 1, 2, hour=9)
second = period(second_start, second_end)
expected = period(first_start, second_end)

assert first + second == period(first_start, second_end)

Tags: 对象方法datetime时间用例pythonicstarttimedeltaperiodendfirstakasecond时间段hour
1条回答
网友
1楼 ·

DateTimeRange库可能会对此提供一些帮助。它不提供开箱即用的功能,但我认为它使编写更容易。你知道吗

from datetimerange import DateTimeRange

def simplify_ranges(dtrs):
    if not dtrs:
        return []
    dtrs = sorted(dtrs, key=lambda dtr: dtr.start_datetime)
    simplified = []
    current = dtrs[0]
    for dtr in dtrs[1:]:
        if current.intersection(dtr).is_valid_timerange():
            current = current.encompass(dtr)
        else:
            simplified.append(current)
            current = dtr
    simplified.append(current)
    return simplified

dtrs = [
    DateTimeRange("2019-01-25T00:00:00+0000", "2019-01-30T00:00:00+0000"),
    DateTimeRange("2019-01-01T00:00:00+0000", "2019-01-10T00:00:00+0000"),
    DateTimeRange("2019-01-21T00:00:00+0000", "2019-01-22T00:00:00+0000"),
    DateTimeRange("2019-01-20T00:00:00+0000", "2019-01-21T00:00:00+0000"),
    DateTimeRange("2019-01-06T00:00:00+0000", "2019-01-15T00:00:00+0000"),
]

print(*simplify_ranges(dtrs), sep='\n')
# 2019-01-01T00:00:00+0000 - 2019-01-15T00:00:00+0000
# 2019-01-20T00:00:00+0000 - 2019-01-22T00:00:00+0000
# 2019-01-25T00:00:00+0000 - 2019-01-30T00:00:00+0000