gpt4 book ai didi

Python:在日期列表中,如何删除属于连续三天或更多天范围的日期?

转载 作者:太空宇宙 更新时间:2023-11-04 09:26:25 24 4
gpt4 key购买 nike

我有一个名为 dates 的日期列表:

我想从此列表中删除属于连续三天或更多天范围内的日期。这些是我在列表中缩进的日期。

最快的方法是什么?

[datetime.date(2018, 7, 2),
datetime.date(2018, 7, 5),
datetime.date(2018, 7, 7),
datetime.date(2018, 7, 15),
datetime.date(2018, 7, 16),
datetime.date(2018, 7, 17),
datetime.date(2018, 7, 29),
datetime.date(2018, 8, 13),
datetime.date(2018, 8, 27),
datetime.date(2018, 9, 19),
datetime.date(2018, 10, 25),
datetime.date(2018, 11, 9),
datetime.date(2018, 12, 21),
datetime.date(2018, 12, 22),
datetime.date(2018, 12, 23),
datetime.date(2018, 12, 24),
datetime.date(2018, 12, 25),
datetime.date(2019, 1, 2),
datetime.date(2019, 1, 3),
datetime.date(2019, 1, 4),
datetime.date(2019, 1, 5),
datetime.date(2019, 1, 6),
datetime.date(2019, 1, 7),
datetime.date(2019, 1, 8),
datetime.date(2019, 2, 27),
datetime.date(2019, 2, 28),
datetime.date(2019, 3, 1),
datetime.date(2019, 3, 2),
datetime.date(2019, 3, 3),
datetime.date(2019, 3, 6),
datetime.date(2019, 3, 11),
datetime.date(2019, 3, 12),
datetime.date(2019, 3, 13),
datetime.date(2019, 3, 14),
datetime.date(2019, 3, 16),
datetime.date(2019, 3, 25),
datetime.date(2019, 3, 27),
datetime.date(2019, 3, 29),
datetime.date(2019, 3, 30),
datetime.date(2019, 4, 8)]

因此删除属于连续三天或更多天范围的日期后的预期结果应该是:

[datetime.date(2018, 7, 2),
datetime.date(2018, 7, 5),
datetime.date(2018, 7, 7),
datetime.date(2018, 7, 29),
datetime.date(2018, 8, 13),
datetime.date(2018, 8, 27),
datetime.date(2018, 9, 19),
datetime.date(2018, 10, 25),
datetime.date(2018, 11, 9),
datetime.date(2019, 3, 6),
datetime.date(2019, 3, 16),
datetime.date(2019, 3, 25),
datetime.date(2019, 3, 27),
datetime.date(2019, 3, 29),
datetime.date(2019, 3, 30),
datetime.date(2019, 4, 8)]

最佳答案

我的解决方案如下:

import datetime

dates = [datetime.date(2018, 7, 2),
datetime.date(2018, 7, 5),
...,
datetime.date(2019, 3, 30),
datetime.date(2019, 4, 8)]


def are_consecutive(d1, d2):
return d2-d1 == datetime.timedelta(1)

filtered_out = set()
consecutive = set()
for i,d in enumerate(sorted(dates)):
try:
d1,d2 = dates[i:i+2]
except:
break
if are_consecutive(d1, d2):
consecutive.add(d1)
consecutive.add(d2)
else:
if len(consecutive) >= 3:
for date in consecutive:
filtered_out.add(date)
consecutive = set()

selected = [d for d in dates if d not in filtered_out]

选中是:

[datetime.date(2018, 7, 2),
datetime.date(2018, 7, 5),
datetime.date(2018, 7, 7),
datetime.date(2018, 7, 29),
datetime.date(2018, 8, 13),
datetime.date(2018, 8, 27),
datetime.date(2018, 9, 19),
datetime.date(2018, 10, 25),
datetime.date(2018, 11, 9),
datetime.date(2019, 3, 6),
datetime.date(2019, 3, 16),
datetime.date(2019, 3, 25),
datetime.date(2019, 3, 27),
datetime.date(2019, 3, 29),
datetime.date(2019, 3, 30),
datetime.date(2019, 4, 8)]

如果您认为 2019 年 2 月 27 日、2 月 28 日和 3 月 1 日是连续的,那是正确的!

简单解释一下代码:are_consecutive() 只是检查两个日期是否连续。如果是这样,它们的差异应该返回 datetime.timedelta(1)。我使用此功能来检查每个日期与下一个日期。日期在循环开始时排序,只是为了确定它们的顺序。如果日期是连续的,它们将存储在 consecutive 集中,如果不是,那么我检查到目前为止已经存储了多少个连续日期。如果大于或等于 3,则将结果保存在 filtered_out 集合中,否则不保存。 consecutive 每次两个日期不连续时都会重置。

关于Python:在日期列表中,如何删除属于连续三天或更多天范围的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57426329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com