填充python数组中的缺失值

时间:2014-02-05 18:44:55

标签: python arrays python-2.7

在Windows上使用:Python 2.7.1

您好,我担心这个问题有一个非常简单的答案,但我似乎无法找到一个合适而有效的解决方案(我的python经验有限)。我正在编写一个只从第三方API(wundergorund)下载历史天气数据的应用程序。问题是,有时某小时没有价值(例如,我们在凌晨5点有20度,早上6点没有值,上午7点有21度)。我需要在任何给定的小时内只有一个温度值,所以我认为我可以拟合我所拥有的数据并评估我缺少的点(使用SciPy的polyfit)。这很酷,但是,我在处理我的程序时遇到问题,以检测列表是否缺少小时数,如果是,则插入缺少的小时并计算温度值。我希望这是有道理的。

我处理小时和温度列表的尝试如下:

from scipy import polyfit

# Evaluate simple cuadratic function
def tempcal (array,x):

    return array[0]*x**2 + array[1]*x + array[2]


# Sample data, note it has missing hours.
# My final hrs list should look like range(25), with matching temperatures at every   point
hrs = [1,2,3,6,9,11,13,14,15,18,19,20]
temps = [14.0,14.5,14.5,15.4,17.8,21.3,23.5,24.5,25.5,23.4,21.3,19.8]

# Fit coefficients
coefs = polyfit(hrs,temps,2)

# Cycle control
i = 0
done = False

while not done:

    # It has missing hour, insert it and calculate a temperature
    if hrs[i] != i:

        hrs.insert(i,i)
        temps.insert(i,tempcal(coefs,i))

    # We are done, leave now
    if i == 24:

        done = True

    i += 1

我可以看到为什么这不起作用,程序最终会尝试访问hrs列表范围之外的索引。我也知道在循环中修改列表的长度必须小心。当然,我要么不够小心,要么完全忽视一个简单的解决方案。

在我的谷歌搜索试图帮助自己时,我遇到了大熊猫(图书馆),但我觉得没有它我就能解决这个问题,(我宁愿这样做)。

非常感谢任何输入。非常感谢。

2 个答案:

答案 0 :(得分:0)

当我相等时,它表示列表中的第二个值。但是只有21个值。

将来我建议您使用带有断点的PyCharm进行调试。或try-except建设。

答案 1 :(得分:0)

不确定我会推荐这种插值方式。我会使用缺失值周围的最近点而不是整个数据集。但是使用numpy你提出的方法是相当直接的。

hrs = np.array(hrs)
temps = np.array(temps)

newTemps = np.empty((25))
newTemps.fill(-300) #just fill it with some invalid data, temperatures don't go this low so it should be safe. 

#fill in original values
newTemps[hrs - 1] = temps 
#Get indicies of missing values
missing = np.nonzero(newTemps == -300)[0]

#Calculate and insert missing values. 
newTemps[missing] = tempcal(coefs, missing + 1)