Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带样条线的平滑线+;datetime对象没有';行不通_Python_Datetime_Matplotlib_Scipy_Interpolation - Fatal编程技术网

Python 带样条线的平滑线+;datetime对象没有';行不通

Python 带样条线的平滑线+;datetime对象没有';行不通,python,datetime,matplotlib,scipy,interpolation,Python,Datetime,Matplotlib,Scipy,Interpolation,我一直在尝试使绘图更平滑,但我的X是datetime对象,与linspace不兼容 我将Xs转换为matplotlib日期: Xnew = matplotlib.dates.date2num(X) X_smooth = np.linspace(Xnew.min(), Xnew.max(), 10) Y_smooth = spline(Xnew, Y, X_smooth) 但我得到了一个空的情节,因为我的Y_是平滑的 [0.0.0.0.0.0.0.0.0.0.0.] 不知什么原因 我怎样才能做到

我一直在尝试使绘图更平滑,但我的X是datetime对象,与linspace不兼容

我将Xs转换为matplotlib日期:

Xnew = matplotlib.dates.date2num(X)
X_smooth = np.linspace(Xnew.min(), Xnew.max(), 10)
Y_smooth = spline(Xnew, Y, X_smooth)
但我得到了一个空的情节,因为我的Y_是平滑的

[0.0.0.0.0.0.0.0.0.0.0.]

不知什么原因

我怎样才能做到这一点

编辑

以下是我打印变量时得到的结果,我没有看到任何异常:

X : [datetime.date(2016, 7, 31), datetime.date(2016, 7, 30), datetime.date(2016, 7, 29)]
X new: [ 736176.  736175.  736174.]
X new max: 736176.0
X new min: 736174.0
XSMOOTH [ 736174.          736174.22222222  736174.44444444  736174.66666667
  736174.88888889  736175.11111111  736175.33333333  736175.55555556
  736175.77777778  736176.        ]
Y [711.74, 730.0, 698.0]
YSMOOTH [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]

您的
X
值是反向的,
scipy.interpolate.spline
要求自变量单调递增,此方法已被弃用-改用
interp1d
(见下文)

请注意,许多样条插值方法要求
X
单调递增:

x
:(N,)数组类似于-独立输入数据的一维数组。一定在增加

x
:(N,)类似数组-数据点的输入维度-必须增加

scipy.interpolate.spline
的默认顺序为三次。由于只有3个数据点,三次样条曲线(
order=3
)和二次样条曲线(
order=2
)之间存在很大差异。下图显示了不同阶样条曲线之间的差异;注:100点用于更平滑拟合曲线

的文档不明确,表明可能不支持该文档。例如,它未列在或上。显示它实际调用和,如下所示:

为向后兼容而存在的函数(不应在新代码中使用)

我会按照你的建议使用。这是当前建议的方法,它在和API中有很好的文档记录,并且默认情况下允许对自变量进行未排序(任意顺序)(请参见API中的
假定\u排序
参数)

如果数据排名不足,它也会引发错误

>>> f = interp1d(X, Y, kind='cubic')
ValueError:x和y数组必须至少有4个条目


我刚刚试过一个例子,你的方法对我很有效。试着调试每一行。
Xnew.min()和
Xnew.max()的值是多少?发布更多细节。
X
X\u平滑
Xnew
的值是多少。用于或可能用于在执行过程中查看中间值。我编辑了问题并添加了变量。从您的输出中,我推断您的问题在于样条曲线,而不是日期时间。你能重新措辞你的问题吗?也许可以用一组较小的数字来解决问题,比如10而不是300,这样在SO中显示起来更容易,调试起来也更容易。同时仔细检查
np.splie
docs我用10做了同样的事情,但没有区别。。这些文档很小,没有示例:,没有什么可学的;(我想你想从scipy那里得到
interp1d
。它可以做一些样条方差。顺序重要吗?如果你用负斜率样条线性线呢?X随着Y的减小而增大……我不知道,也许,我没有读过
scipy.interpolate.spline
上的文档,但这不重要,
np.linspace
Xsmooth>的输出
与原始输入相反,
Xnew
,所以这就是问题所在,它不一致。无法解释..当我按照你说的做时:
newX=list(reversed(matplotlib.dates.date2num(X)))Y=list(reversed(Y))X_smooth=np.linspace(min(newX),max(newX),10)Y_smooth=spline(newX,Y,xooth)
我得到:
[755.1000.68447671 1062.10559586 991.91003112 842.74445597 667.25554403 518.08996888 447.89440414 509.31552329 755.]
对于这个Y:
[755.0,755.0,755.0]
我觉得绘制数据可能会更好地了解问题的目的。我的观点是……反转不起作用,但cricket的interp1d效果很好,谢谢大家的帮助
>>> spline(
...     list(reversed(X)),  # <-- reverse order of X so also
...     list(reversed(Y)),  # <-- reverse order of Y to match
...     Xsmooth
... )
array([  698.        ,   262.18297973,   159.33767533,   293.62017489,
         569.18656683,   890.19293934,  1160.79538066,  1285.149979  ,
        1167.41282274,   711.74      ])
>>> from scipy.interpolate import interp1d
>>> f = interp1d(X, Y, kind='quadratic')
>>> f(Xsmooth)
array([ 711.74      ,  720.14123457,  726.06049383,  729.49777778,
        730.45308642,  728.92641975,  724.91777778,  718.4271605 ,
        709.4545679 ,  698.        ])
>>> f = interp1d(X, Y, kind='cubic')