[英]Insert missing dates while keeping the date order in python list
我有一個包含[yyyy,value]項目的列表列表,每個子列表按遞增年份排序。 這是一個示例:
A = [
[[2008, 5], [2009, 5], [2010, 2], [2011, 5], [2013, 17]],
[[2008, 6], [2009, 3], [2011, 1], [2013, 6]], [[2013, 9]],
[[2008, 4], [2011, 1], [2013, 4]],
[[2010, 3], [2011, 3], [2013, 1]],
[[2008, 2], [2011, 4], [2013, 1]],
[[2009, 1], [2010, 1], [2011, 3], [2013, 3]],
[[2010, 1], [2011, 1], [2013, 5]],
[[2011, 1], [2013, 4]],
[[2009, 1], [2013, 4]],
[[2008, 1], [2013, 3]],
[[2009, 1], [2013, 2]],
[[2013, 2]],
[[2011, 1], [2013, 1]],
[[2013, 1]],
[[2013, 1]],
[[2011, 1]],
[[2011, 1]]
]
我需要的是在min(year)和max(year)之間插入所有缺失的年份,並確保保留訂單。 因此,例如,取A的第一個子列表:
[2008, 5], [2009, 5], [2010, 2], [2011, 5], [2013, 17]
應該是這樣的:
[min_year, 0]...[2008, 5], [2009, 5], [2010, 2], [2011, 5], [2012, 0],[2013, 17],..[max_year, 0]
此外,如果任何子列表僅包含單個項目,則應對其應用相同的過程,以便原始值保留其假定的順序,並且正確插入min到max(year,value)項目的其余部分。
有任何想法嗎?
謝謝。
怎么樣:
import numpy as np
def np_fill(data,min_year,max_year):
#Setup empty array
year_range=np.arange(min_year,max_year+1)
unit=np.dstack((year_range,np.zeros(max_year-min_year+1)))
overall=np.tile(unit,(len(data),1,1)).astype(np.int)
#Change the list to a list of ndarrays
data=map(np.array,data)
for num,line in enumerate(data):
#Find correct indices and update overall array
index=np.searchsorted(year_range,line[:,0])
overall[num,index,1]=line[:,1]
return overall
運行代碼:
print np_fill(A,2008,2013)[:2]
[[[2008 5]
[2009 5]
[2010 2]
[2011 5]
[2012 0]
[2013 17]]
[[2008 6]
[2009 3]
[2010 0]
[2011 1]
[2012 0]
[2013 6]]]
print np_fill(A,2008,2013).shape
(18, 6, 2)
您在A的第二行中有2013年的副本,不確定這是否有目的。
有幾個時間因為我很好奇,源代碼可以在這里找到。 如果您發現錯誤,請告訴我。
開始年/年 - (2008,2013):
np_fill took 0.0454630851746 seconds.
tehsockz_fill took 0.00737619400024 seconds.
zeke_fill_fill took 0.0146050453186 seconds.
有點期待這一點 - 轉換為numpy數組需要花費大量時間。 為了實現收支平衡,看起來這些年份的跨度需要大約為30:
開始年/年 - (1985,2013):
np_fill took 0.049400806427 seconds.
tehsockz_fill took 0.0425939559937 seconds.
zeke_fill_fill took 0.0748357772827 seconds.
Numpy當然會從那里逐漸變得更好。 如果你因任何原因需要返回一個numpy數組,numpy算法總是更快。
minyear = 2008
maxyear = 2013
new_a = []
for group in A:
group = group
years = [point[0] for point in group]
print years
for year in range(minyear,maxyear+1):
if year not in years:
group.append([year,0])
new_a.append(sorted(group))
print new_a
這會產生:
[ [[2008, 5], [2009, 5], [2010, 2], [2011, 5], [2012, 0], [2013, 17]],
[[2008, 6], [2009, 3], [2010, 0], [2011, 1], [2012, 0], [2013, 6]],
[[2008, 0], [2009, 0], [2010, 0], [2011, 0], [2012, 0], [2013, 9]],
[[2008, 4], [2009, 0], [2010, 0], [2011, 1], [2012, 0], [2013, 4]],
[[2008, 0], [2009, 0], [2010, 3], [2011, 3], [2012, 0], [2013, 1]],
[[2008, 2], [2009, 0], [2010, 0], [2011, 4], [2012, 0], [2013, 1]],
[[2008, 0], [2009, 1], [2010, 1], [2011, 3], [2012, 0], [2013, 3]],
[[2008, 0], [2009, 0], [2010, 1], [2011, 1], [2012, 0], [2013, 5]],
[[2008, 0], [2009, 0], [2010, 0], [2011, 1], [2012, 0], [2013, 4]],
[[2008, 0], [2009, 1], [2010, 0], [2011, 0], [2012, 0], [2013, 4]],
[[2008, 1], [2009, 0], [2010, 0], [2011, 0], [2012, 0], [2013, 3]],
[[2008, 0], [2009, 1], [2010, 0], [2011, 0], [2012, 0], [2013, 2]],
[[2008, 0], [2009, 0], [2010, 0], [2011, 0], [2012, 0], [2013, 2]],
[[2008, 0], [2009, 0], [2010, 0], [2011, 1], [2012, 0], [2013, 1]],
[[2008, 0], [2009, 0], [2010, 0], [2011, 0], [2012, 0], [2013, 1]],
[[2008, 0], [2009, 0], [2010, 0], [2011, 0], [2012, 0], [2013, 1]],
[[2008, 0], [2009, 0], [2010, 0], [2011, 1], [2012, 0], [2013, 0]],
[[2008, 0], [2009, 0], [2010, 0], [2011, 1], [2012, 0], [2013, 0]]]
你走了,希望你喜歡它!
min_year = 2007 # for testing purposes I used these years
max_year = 2014
final_list = [] # you're going to be adding to this list the corrected values
for outer in A: # start by iterating through each outer list in A
active_years = {} # use this dictionary to keep track of which years are in each list and their values; sorry if you don't know about dictionaries
for inner in outer: # now iterate through each year in each of the outer lists and create a dictionary entry for each (print to see what it's doing)
active_years[inner[0]] = inner[1] # see who I'm creating a new key-value pair with the key as the year given by the 0th index of inner
new_outer = [] # this will be your new outer list
for year in range(min_year, max_year + 1): # now add to your active_years dictionary all the other years and give them value 0
if year not in active_years.keys(): # only add the years not in your dictionary already
active_years[year] = 0
for entry in active_years.keys(): # we now iterate through each key, in order
new_outer += [[entry, active_years[entry]]] # create your new outer list, watch carefully the brackets
final_list += [new_outer] # add to the final_list
print final_list # presto
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.