首页 > 解决方案 > 拟合时间戳 TZ-aware 不显示年份 x-label

问题描述

我想线性拟合在 x 轴标签中显示年份的 8 年时间序列数据。
出现问题是因为我TZ-awaredataframe. 所以,我不能直接将我的拟合代码与这种类型的时间戳一起使用。文件在这里。这就是我所做的。

# Convert TZ-aware timestamp intu numbers
ts = df['Timestamp'].apply(lambda x:x.toordinal()).sort_values()

# Fit
from numpy.polynomial.polynomial import polyfit
y = df.data
x = ts

fig, (ax) = plt.subplots(1,1, figsize=(10, 6))
ax.scatter(x, y)

b, m = polyfit(x, y, 1)
plt.plot(x, b + m * x, 'blue', linewidth=1.5)

plt.show()

结果如下。

在此处输入图像描述

正如预期的那样,它有效。但是,x 轴显示的是数字而不是年份。我想在 x 轴上 显示月-年标签。

任何帮助都会很棒,并在此先感谢。

标签: pythontimezonetime-seriesregression

解决方案


@Dodge 在这篇文章中的代码给了我解决方案。

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

y_values = df.loc[:, "data"]
x_values = np.linspace(0,1,len(df.loc[:, "data"]))
poly_degree = 1

coeffs = np.polyfit(x_values, y_values, poly_degree)
poly_eqn = np.poly1d(coeffs)
y_hat = poly_eqn(x_values)

plt.figure(figsize=(8,4))
plt.plot(df.loc[:, "Timestamp"], df.loc[:,"data"], "ro")
plt.plot(df.loc[:, "Timestamp"],y_hat)
plt.ylabel('data')
plt.xlabel('Year')

推荐阅读