[英]How do I find if a datetime in one list falls in between dates in another list in a quick manner (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)
,假設兩個列表都已排序並且不會處理錯誤(例如當您到達任何特定報價單的最后一個季度時),但它應該指向正確的方向。
我也沒有運行第二部分,因此可能存在錯誤,但邏輯應該是合理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.