我正在使用Python 2.7,并且有时间戳和相应的值。我想将这些值设置为每秒一个值的时基,即最后一个测量值。所以:
[[1, 4, 6],
[15, 17, 12]]
至:
[[1, 2, 3, 4, 4, 6],
[15, 15, 15, 17, 17, 12]]
我想出了这个,它可以满足我的要求,但是必须有一种更优雅的方法。有人知道吗?
import numpy as np
#Example data:
origdata= {}
origdata['time'] = [4, 26, 37, 51, 59, 71, 93]
origdata['vals'] = [17, 5, 43, 21, 14, 8, np.NaN]
extratime = [t-1 for t in origdata['time']]
data={}
data['time'] = np.concatenate((origdata['time'][:-1], extratime[1:]), axis=0)
data['vals'] = np.concatenate((origdata['vals'][:-1], origdata['vals'][:-1]), axis=0)
sorter = data['time'].argsort()
data['time'] = data['time'][sorter]
data['vals'] = data['vals'][sorter]
filledOutData = {}
filledOutData['time'] = range(data['time'][0], data['time'][-1])
filledOutData['vals'] = np.interp(filledOutData['time'], data['time'], data['vals'])
使用以下代码绘制原始数据和所需结果可得到下图:
import matplotlib.pyplot as plt
plt.plot(origdata['time'], origdata['vals'], '-o', filledOutData['time'], filledOutData['vals'], '.-')
plt.legend(['original', 'desired result'])
plt.show
最佳答案
尝试这个:
data = {}
times = [4, 26, 37, 51, 59, 71, 93]
vals = [17, 5, 43, 21, 14, 8, float('nan')]
# i don't have numpy so i had to change to nan
for i in range(times[0], times[-1]+1):
if i in times:
v = vals[times.index(i)]
data.setdefault('time', []).append(i)
data.setdefault('vals', []).append(v)
print data['time']
[4、5、6、7、8、9、10、11、13、14、15、16、17、18、19、20、21、22、23、24、25、26、27、28 ,29、30、31、32、33、34、35、36、37、38、39、40、41、42、43、44、45、46、47、48、49、50、51、52、53 ,54、55、56、57、58、59、60、61、62、63、64、65、66、67、68、69、70、71、72、73、74、75、76、77、78 ,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93]
print data['vals']
[17、17、17、17、17、17、17、17、17、17、17、17、17、17、17、17、17、17、17、5、5、5, ,5、5、5、5、5、5、5、5、43、43、43、43、43、43、43、43、43、43、43、43、43、43、43、43、21、21、21 ,21,21,21,21,21,14,14,14,14,14,14,14,14,14,14,14,14,14,8,8,8,8,8,8,8,8 ,8,8,8,8,8,8,8,8,8,8,8,8,8,nan]
关于python - 逐个常数插值的函数,它每秒复制一次最后一个值直到Python 2.7中的下一个数据点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35871809/