Как создать график BSpline или polyfit, где значения x являются объектами datetime?

#python #numpy #datetime #matplotlib #bspline

#python #numpy #datetime #matplotlib #bspline

Вопрос:

Итак, для школьного проекта я разрабатываю программу, которая создает график высот прилива с течением времени. BSpline не принимает объекты datetime, как и np.linspace, который, как я видел, необходим для запуска BSpline.

Я пытался использовать pandas для преобразования datetime в значение, которое np может прочитать, или с помощью datetime64. В приведенном ниже коде я удалил все свои неудачные методы и просто оставил голые кости.

 import matplotlib.pyplot as pyplot
from matplotlib.dates import date2num, datestr2num
import numpy as np 
import matplotlib.dates as mdates
from scipy.interpolate import make_interp_spline,BSpline

test_xvals = [datetime(1900, 1, 1, 1, 28), datetime(1900, 1, 1, 5, 47), datetime(1900, 1, 1, 13, 7), datetime(1900, 1, 1, 20, 43)]  #times which correspond to the height of the tides
test_yvals =  [3.3, 3.9, 0.8, 4.5] #height of the tides in meters

times = date2num(test_xvals) #converts to object compatible with numpy and matplotlib
heights = np.array(test_yvals) #array of 4 floats

x_smooth = np.linspace(times.min(), times.max(), 300)
spl = make_interp_spline(times,heights , k=3) #BSpline object
y_smooth = spl(x_smooth)


fig, ax = plt.subplots()
ax.plot(x_smooth, y_smooth)
ax.scatter(times,heights)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
#pyplot.xticks(dates,xlabels)
pyplot.ylim(0,6)
  

Синусоидальный график не соответствует точкам данных. Какие атрибуты BSpline я должен настроить, чтобы точки данных совпадали с локальными максимальными / минимальными значениями?
График с несинхронизированными точками данных

Комментарии:

1. Вы ожидаете, что мы угадаем, где возникает ошибка?

2. Извините! Обновил его.

3. Перечитайте BSpline документы.

4. Перечитывание документов BSpline не помогло, но я, наконец, нашел вопрос о переполнении стека, который отвечал на аналогичную проблему и привел мой график к кривой. Однако эти кривые не совпадают с фактическими точками данных (я обновил код и включил изображение выходных данных). Как я могу это исправить?

5. То, что бросилось мне в глаза, заключалось в том, что третий аргумент, k , должен быть единственным числом. Вы предоставили ему массив из linspace.