Сплайн-интерполяция с датой и временем - PullRequest
0 голосов
/ 04 мая 2018

Я кодирую приложение на Python, которое собирает информацию о температуре и времени и отображает их на графике.

Как видно здесь Гладкая линия со сплайном + объекты даты и времени не работают

Я хочу интерполировать несколько значений температуры, чтобы сгладить временную диаграмму.

Эта функция извлекает значения температуры и времени и помещает их в массив, связанный с положением (Спальня и Кухня):

    xTemp, yTemp = dataList[1].split(',')
    xTime, yTime = dataList[3].split(',')

    t = datetime.fromtimestamp(float(xTime)).strftime('%Y-%m-%d %H:%M:%S')  # get time string
    st = datetime.strptime(t, '%Y-%m-%d %H:%M:%S')  # get datetime from time string

    x.append(st)
    y.append(xTemp)
    X = np.array(x)
    Y = np.array(y)
    Xnew = matplotlib.dates.date2num(X)

    if(len(X) >= 5):
        X_smooth = np.linspace(Xnew.min(), Xnew.max(), 10)
        Y_smooth = interp1d(X, Y, X_smooth)  
        # , assume_sorted = True, kind = 'quadratic')
        a.plot(X_smooth, Y_smooth)

Я получил эту ошибку:

NotImplementedError: [736817.73790509 736817.73791152 736817.73791795 736817.73792438
 736817.73793081 736817.73793724 736817.73794367 736817.7379501
 736817.73795653 736817.73796296] is unsupported: Use fitpack routines for other types.

Вы можете мне помочь? Спасибо

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

interp1d возвращает функцию. Попробуйте следующее:

Y_smooth = interp1d(X, Y)
print (Y_smooth(X_smooth[0]))
0 голосов
/ 04 мая 2018

Вы используете функцию interp1d неправильно. Из документов:

Этот класс возвращает функцию, метод вызова которой использует интерполяцию для поиска значения новых точек

Как видно из примера на той же странице, вы должны вызывать interp1d только с имеющимися у вас значениями x и y. Это возвращает функцию, в которую вы можете передавать новые значения x и которая возвращает интерполированные значения y:

x = np.arange(0, 10)
y = np.exp(-x/3.0)
f = interpolate.interp1d(x, y)

xnew = np.arange(0, 9, 0.1)
ynew = f(xnew)   # use interpolation function returned by `interp1d`

Так что в вашем случае это будет:

f = interp1d(X, Y)
X_smooth = np.linspace(Xnew.min(), Xnew.max(), 10)
Y_smooth = f(X_smooth) 
...