gpt4 book ai didi

python - 如何将两个日期列表合并为一系列日期间隔?

转载 作者:太空宇宙 更新时间:2023-11-03 15:22:58 25 4
gpt4 key购买 nike

我有开始日期列表和结束日期列表。它们被排序...

start_dates = [
datetime.date(2009, 11, 5), datetime.date(2009, 11, 13),
datetime.date(2009, 11, 25), datetime.date(2009, 11, 26),
datetime.date(2009, 12, 4), datetime.date(2009, 12, 7),
datetime.date(2009, 12, 29), datetime.date(2009, 12, 30)]

end_dates = [
datetime.date(2009, 10, 1), datetime.date(2009, 10, 2),
datetime.date(2009, 10, 9), datetime.date(2009, 10, 12),
datetime.date(2009, 11, 4), datetime.date(2009, 12, 14),
datetime.date(2009, 12, 15)]

开始日期表示我们收到购买股票建议的日期。结束日期是我们收到出售建议的日期。建议的来源不同,我们正在回溯测试如果我们使用一个来源的买入建议,但使用另一个来源的卖出建议会发生什么。因此,我们有两个日期序列,我们希望将其分解成对(或间隔),我们将在这些日期内持有股票头寸。

因此,我们将从 start_dates 中选取一个日期来决定何时购买股票:11 月 5 日我们购买一个头寸。然后我们循环遍历 end_dates 寻找第一个卖出建议:12 月 14 日。然后重复,当我们从一个来源获得建议时不持有头寸时买入,当我们从另一个来源持有头寸时卖出。

你可能会说我们想在我们正在循环的两个列表中的哪一个之间摆动。

因此上面的输入生成:

result = (
(datetime.date(2009, 11, 5), datetime.date(2009, 12, 14)),
(datetime.date(2009, 12, 29), None)
)

我在 for 循环中使用 for 循环,想知道是否有更好的方法。性能很有趣,因为它将在 40 年的时间跨度内应用于数千个场景;一些列表涉及数千个日期。

最佳答案

编辑

这应该与 len(start_dates)+len(end_dates) 成比例:

def date_range(start_dates, end_dates):
result = []

start_i = 0
end_i = 0

while start_i<len(start_dates):
while end_i<len(end_dates) and start_dates[start_i]>end_dates[end_i]:
end_i += 1
if end_i == len(end_dates):
result.append((start_dates[start_i], None))
break
result.append((start_dates[start_i], end_dates[end_i]))
while start_i<len(start_dates) and start_dates[start_i]<=end_dates[end_i]:
start_i += 1
end_i += 1

return result

用法:

In  : start_dates = [
....: datetime.date(2009, 11, 5), datetime.date(2009, 11, 13),
....: datetime.date(2009, 11, 25), datetime.date(2009, 11, 26),
....: datetime.date(2009, 12, 4), datetime.date(2009, 12, 7),
....: datetime.date(2009, 12, 29), datetime.date(2009, 12, 30)]

In : end_dates = [
....: datetime.date(2009, 10, 1), datetime.date(2009, 10, 2),
....: datetime.date(2009, 10, 9), datetime.date(2009, 10, 12),
....: datetime.date(2009, 11, 4), datetime.date(2009, 12, 14),
....: datetime.date(2009, 12, 15)]

In : date_range(start_dates, end_dates)
Out:
[(datetime.date(2009, 11, 5), datetime.date(2009, 12, 14)),
(datetime.date(2009, 12, 29), None)]

In : start_dates = [
....: datetime.date(2009, 11, 5), datetime.date(2009, 11, 13),
....: datetime.date(2009, 11, 25), datetime.date(2009, 11, 26),
....: datetime.date(2009, 12, 4), datetime.date(2009, 12, 7),
....: datetime.date(2009, 12, 29), datetime.date(2009, 12, 30)]

In : end_dates = [
....: datetime.date(2009, 10, 1), datetime.date(2009, 10, 2),
....: datetime.date(2009, 10, 9), datetime.date(2009, 10, 12),
....: datetime.date(2009, 11, 7), datetime.date(2009, 12, 14), # changed (2009, 11, 4) -> (2009, 11, 7)
....: datetime.date(2009, 12, 15)]

In : date_range(start_dates, end_dates)
Out:
[(datetime.date(2009, 11, 5), datetime.date(2009, 11, 7)),
(datetime.date(2009, 11, 13), datetime.date(2009, 12, 14)),
(datetime.date(2009, 12, 29), None)]

关于python - 如何将两个日期列表合并为一系列日期间隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102751/

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