我在第二篇文章中找到了解决方案的关键并将其拼凑在一起。
我的问题有两个部分:
- 如何有效地表示日期列表
回答:https://stackoverflow.com/a/9589929/2150673
pto = [
'2020-01-03',
'2020-01-08',
'2020-01-02',
'2020-01-07',
'2020-01-01',
'2020-01-06'
]
ordinal_dates = [datetime.datetime.strptime(i, '%Y-%m-%d').toordinal() for i in pto]
- 获得整数表示的日期列表后,您可以简单地查找连续整数并获取每个范围的上限和下限,然后转换回 yyyy-mm-dd 格式。
回答:https://stackoverflow.com/a/48106843
def ranges(nums):
nums = sorted(set(nums))
gaps = [[s, e] for s, e in zip(nums, nums[1:]) if s+1 < e]
edges = iter(nums[:1] + sum(gaps, []) + nums[-1:])
return list(zip(edges, edges))
我的完整功能:
def get_date_ranges(pto_list: list) -> list:
pto_dates = [datetime.datetime.strptime(i, '%Y-%m-%d').toordinal() for i in pto_list]
nums = sorted(set(pto_dates))
gaps = [[s, e] for s, e in zip(nums, nums[1:]) if s + 1 < e]
edges = iter(nums[:1] + sum(gaps, []) + nums[-1:])
ordinal_ranges = list(zip(edges, edges))
date_bounds = []
for start, end in ordinal_ranges:
date_bounds.append((
datetime.datetime.fromordinal(start).strftime('%Y-%m-%d'),
datetime.datetime.fromordinal(end).strftime('%Y-%m-%d')
))
return date_bounds