用scipy替换NULL数据

时间:2014-08-11 15:55:28

标签: python numpy scipy interpolation

我希望使用scipy替换少量的NULL数据,而不必将它们与不切实际的线性线连接起来(数据是可视化的)。我已经看过一些文档和示例,但很难将我看到的内容与我的上下文中的用法联系起来。

例如,如下所示;

enter image description here

我有一个方法可以找到之前的最后一个值以及这组NULL条目之后的第一个值。

我如何使用这些值并返回三个插值的对象来写入我的数据集?

编辑:

我正在尝试从数据创建两个numpy数组,这两个数组包含两个包含一系列NULL值的实数值。我从我编写的SQL服务器类中获取数据作为列表。我想这样做;

    time = connection.getColumnData('DateTimeStamp', table, extreme_values['start_time'] + '.000', extreme_values['end_time'] + '.000')
    val = connection.getColumnData(column, table, extreme_values['start_time'] + '.000', extreme_values['end_time'] + '.000')
    time = [str(d) for d in time]
    #val = [float(d) for d in val]

    val_num = np.asarray(val, dtype=float)
    time_num = np.asarray(time, dtype='datetime64')
    not_nan = ~np.isnan(val_num, dtype=bool)

但它在运行时在线上断开;

    filled_data = np.interp(time_num, time_num[not_nan], val_num[not_nan])

在每个val_num中举行;

array([ 5.625 ,     nan,     nan,     nan,  5.4375])

在time_num;

array(['2012-04-05T07:30:00+0000', '2012-04-05T08:00:00+0000',
   '2012-04-05T08:30:00+0000', '2012-04-05T09:00:00+0000',
   '2012-04-05T09:30:00+0000'], dtype='datetime64[s]')

在not_non;

 array([ True, False, False, False,  True], dtype=bool)

1 个答案:

答案 0 :(得分:1)

假设您的数据包含两个numpy数组(称为datatimestamp),并且您希望根据NaN数组填充data数组中的not_nan = ~numpy.isnan(data) filled_data = numpy.interp(timestamp, timestamp[not_nan], data[not_nan]) 值时间戳,您可以使用numpy.interp

getColumnData

编辑:将数据放入numpy数组实际上是一个棘手的部分。我猜你的None来电的结果大部分是数字的,NULL的{​​{1}}值为In [3]: np.array([4,3,None,4,2,1]) Out[3]: array([4, 3, None, 4, 2, 1], dtype=object) In [4]: np.isnan(_) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-4328b1685393> in <module>() ----> 1 np.isnan(_) TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' 。让我们看看在这种情况下会发生什么:

None

numpy.isnan的存在意味着numpy不知道这是一个数字数组,这就是In [7]: np.array([4,3,None,4,2,1], dtype=float) Out[7]: array([ 4., 3., nan, 4., 2., 1.]) In [8]: np.isnan(_) Out[8]: array([False, False, True, False, False, False], dtype=bool) 调用失败的原因。我们可以通过告诉numpy我们确实想要一个数字数组来解决这个问题:

{{1}}