如何快速确定一个列表中的日期时间是否落在另一个列表中的日期之间(python)



我有看起来像这样的列表,里面有很多股票代码、值和日期:

values = [['NKE', 1, 2, datetime.datetime(2016, 2, 20)], ['AAPL', 1, 2, datetime.datetime(2016, 2, 1)],['AAPL', 3, 4, datetime.datetime(2016,4,2)]...]
releasedates = [['AAPL', Q3, 2015, datetime.datetime(2015, 10,5)], ['AAPL', Q4,2015, datetime.datetime(2016, 2, 5)], ['AAPL', Q1, 2016, datetime.datetime(2016, 4, 9)]

发布日期是指该公司的季度末。 我想要一个列表,其中包含每行值中的所有信息,但也显示信息将成为哪个季度的一部分。 因此,对于上述信息,最终结果将如下所示:

values_releasedates = [...['AAPL',1,2, Q4, 2015], ['AAPL', 3,4, Q1, 2016]...]

(我在这里只显示 AAPL,其他公司,如 NKE 的价值也会在那里有自己的条目)

这里的代码有效:

values_releasedates = [[ticker, a, b, quarter, year] for ticker, a, b, date in values for [ticker_1, quarter_1, year_1, date_1], [ticker_2, quarter_2, year_2, date_2] in zip(releasedates, releasedates[1:]) if date_1 < date < date_2 and ticker == ticker_1]

但需要很长时间。 我在想也许我可以创建某种字典来以某种方式节省时间,这样如果在值中弹出 NKE 条目,它只会查看 NKE 发布日期。 但我是一个新手,我不知道从哪里开始。

让我让你朝着正确的方向开始:

按股票代码打破两个列表:

# Example of values
values_by_ticker = {}
for value in values:
    try:
        values_by_ticker[value[0]].append(value)
    except KeyError:
        values_by_ticker[value[0]] = [value]

然后,遍历values_by_ticker中的每个值,确定它何时属于:

result = []
for ticker in values_by_ticker:
    release_index = 0
    for value in ticker:
        while True:
            daterange = (rel_by_ticker[release_index], 
                         rel_by_ticker[release_index + 1])
            if is_in_range(value[3], daterange): # Exercise left for the reader
                result.append([value[0], 
                               value[1], 
                               value[2], 
                               rel_by_ticker[release_index][1], 
                               rel_by_ticker[release_index][1]])
                break
            else:
                release_index += 1

这是O(n+m),假设两个列表都已排序并且不会处理错误(例如,当您到达任何特定股票的最后一个季度时),但它应该为您指明正确的方向。

我也没有运行第二部分,所以可能会有错误,但逻辑应该是合理的。

最新更新