我有这样的日期时间和值列表:
import datetime
x = [datetime.datetime(2016, 9, 26, 0, 0), datetime.datetime(2016, 9, 27, 0, 0),
datetime.datetime(2016, 9, 28, 0, 0), datetime.datetime(2016, 9, 29, 0, 0),
datetime.datetime(2016, 9, 30, 0, 0), datetime.datetime(2016, 10, 1, 0, 0)]
y = [26060, 23243, 22834, 22541, 22441, 23248]
可以像这样绘制它们:
import matplotlib.pyplot as plt
plt.plot(x, y)
我希望能够使用更多x点来绘制平滑版本。所以首先我这样做:
delta_t = max(x) - min(x)
N_points = 300
xnew = [min(x) + i*delta_t/N_points for i in range(N_points)]
然后尝试使用scipy进行样条拟合:
from scipy.interpolate import spline
ynew = spline(x, y, xnew)
TypeError:根据规则' safe'
,无法将数组数据从dtype(' O')转换为dtype(' float64')
最好的方法是什么?我对涉及其他图书馆的解决方案持开放态度,例如pandas或plotly。
答案 0 :(得分:1)
您正在尝试将日期时间列表传递给样条函数,它们是Python对象(因此dtype('O')
)。您需要先将日期时间转换为数字格式,然后根据需要将其转换回来:
int_x = [i.total_seconds() for i in x]
ynew = spline(int_x, y, xnew)
编辑:total_seconds()实际上是timedelta方法,而不是日期时间。但是看起来你把它整理出来所以我会保留这个答案。
答案 1 :(得分:1)
找出一些东西:
x_ts = [x_.timestamp() for x_ in x]
xnew_ts = [x_.timestamp() for x_ in xnew]
ynew = spline(x_ts, y, xnew_ts)
plt.plot(xnew, ynew)
这非常好用,但我仍然对更简单的方法有所了解。