Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何快速查找一个列表中的日期时间是否位于另一个列表中的日期之间(python)?_Python_List_Datetime - Fatal编程技术网

如何快速查找一个列表中的日期时间是否位于另一个列表中的日期之间(python)?

如何快速查找一个列表中的日期时间是否位于另一个列表中的日期之间(python)?,python,list,datetime,Python,List,Datetime,我有这样的列表,上面有很多标记、值和日期: 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',

我有这样的列表,上面有很多标记、值和日期:

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)]
releasedates是指该公司的季度末。我想有一个列表,在每一行的值中包含所有信息,但也显示了信息将属于哪个季度。因此,对于上述信息,最终结果如下所示:

values_releasedates = [...['AAPL',1,2, Q4, 2015], ['AAPL', 3,4, Q1, 2016]...]
(我在这里只显示AAPL,其他公司如NKE from values也会在那里提供他们自己的条目)

此代码在这里起作用:

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]
values\u releasedate=[[ticker,a,b,quarter,year\u 1,date\u 1],[ticker\u 2,quarter\u 2,year\u 2,date\u 2]zip中的[ticker,a,b,quarter,year\u 2,date\u 2]中的[ticker,a,b,date],如果date\u 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]
然后,通过_ticker遍历values_中的每个值,找出它属于什么时候:

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)
,假设两个列表都已排序,并且不会处理错误(例如,当您到达任何特定股票代码的最后一个季度时),但它应该为您指明正确的方向


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

让我让您从正确的方向开始:

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

# 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]
然后,通过_ticker遍历values_中的每个值,找出它属于什么时候:

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)
,假设两个列表都已排序,并且不会处理错误(例如,当您到达任何特定股票代码的最后一个季度时),但它应该为您指明正确的方向


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

您试图在单一列表理解中做得太多,因此,您的方法中存在逻辑错误和低效:这将填充在股票代码AAPLQ1/Q2之间的所有股票代码日期,这些日期在它的范围内,我相当肯定这不是你的意图。@TemporalWolf如果你说的是我希望所有带有AAPL标记的值的条目都附加在正确的两个提交日期之间,我确实希望这样做。每季度可能会有很多。有没有关于如何提高效率的想法?(我更新了我的代码,让它指定ticker==ticker\u 1的位置)您当前的代码是
O(n*m)
,而优化的版本是
O(n+m)
(假设值已经按日期排序)。你需要像我说的那样,打破这个列表。按ticker将两个列表分成多个列表。然后,对于每个股票代码,为该股票代码构建一次季度范围,然后在两个列表中迭代,直到您逐个股票代码[ticker]
到达
值的末尾。您试图在单个列表理解中做得太多,因此,您的方法中存在逻辑错误和低效:这将在代码AAPLQ1/Q2之间填充介于其范围之间的所有代码日期,我相当确定这不是您的意图。@TemporalWolf如果您的意思是,我希望所有带有AAPL代码的值中的条目都附加在正确的两个提交日期之间,我真的希望这样。每季度可能会有很多。有没有关于如何提高效率的想法?(我更新了我的代码,让它指定ticker==ticker\u 1的位置)您当前的代码是
O(n*m)
,而优化的版本是
O(n+m)
(假设值已经按日期排序)。你需要像我说的那样,打破这个列表。按ticker将两个列表分成多个列表。然后,对于每个股票代码,为该股票代码构建一次季度范围,然后在两个列表中迭代,直到到达股票代码[ticker]
values\u末尾。