是否有一种毕达通的方法来表示两个给定的datetimes之间的周期,而不是表示它们之间的时间量(又名)。( 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)发布于 2019-04-04 09:37:32
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+0000https://stackoverflow.com/questions/55510973
复制相似问题