如何将两个日期列表合并成一系列的日期间隔?

2024-06-01 05:19:10 发布

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

我有开始日期和结束日期的列表。它们被分类。。。在

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)]

开始日期代表我们收到购买股票建议的日期。截止日期是我们收到出售建议的日期。建议的来源是不同的,我们正在回溯测试如果我们使用来自一个来源的购买建议,而另一个来源的销售建议会发生什么。因此,我们有两个日期序列,我们想把它们分解成成对的或者间隔的,我们可以在这段时间内持有股票。在

因此,我们将从起始日期开始确定何时买入股票:11月5日我们买入头寸。然后我们在结束日期循环寻找第一个销售建议:12月14日。再说一遍,当我们没有持仓时,当我们从一个来源得到建议时买入,当我们确实持有来自另一个来源的头寸时卖出。在

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

因此,上述输入产生:

^{pr2}$

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


Tags: 列表fordatetimedate来源分类代表序列
3条回答

编辑

这应该按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

用法:

^{pr2}$

我终于确定了:

    trades = []
    enddate = datetime.date(1900, 1, 1)
    try:
        for startdate in startdates:
            if enddate <= startdate:
                enddate = enddates.next()
                while enddate <= startdate:
                    enddate = enddates.next()
                trades.append((startdate, enddate))
    except StopIteration:
        trades.append((startdate, None))

感谢那些提问和回答的人。这个小小的谜题毫无道理地成为了我的定心丸,但我想我终于做到了这一点,我应该继续我的生活。它最终真的非常简单-令人惊讶的是,它花了这么多的工作来使它变得如此简单!在

我认为这应该可以得到日期元组,但我不能建议你不使用for循环的方法,因为它可能会变得更复杂。在

不过,逻辑是相当简单和明显的。在

result = []
for startd in start_dates:
    if not result or result[-1][1] is not None and startd>result[-1][1]:
    #can use 'len(result)==0' instead of 'not result'
        for endd in end_dates:
            if endd>startd:
                result.append((startd,endd))
                break
        else:
            result.append((start,None))
    if result[-1][1] is None:
        break

result = tuple(result)
print result

相关问题 更多 >