在python中插入平滑matplotlib图的日期时间

时间:2016-10-27 23:19:01

标签: python datetime numpy matplotlib scipy

我有这样的日期时间和值列表:

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。

2 个答案:

答案 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)

这非常好用,但我仍然对更简单的方法有所了解。