1

我在绘制pandas具有PeriodIndex.

我的数据有差距,我想实现以下目标:

  • 间隙应保持间隙,无需插值;
  • 由于每个值在整个时间段内都有效,因此该值应在整个时间段内显示为水平线。
  • 锦上添花:期间边界处没有垂直线。

例子

yearly = pd.DataFrame({'avSpeed': [50, 40, 20, 16]}, index=pd.PeriodIndex(['2014', '2015', '2018', '2019'], freq='A'))

      avSpeed
2014       50
2015       40
2018       20
2019       16

到目前为止我的代码

  • 通过填充间隙NaN(通过以不变的频率重新采样)使数据帧无间隙:

    yearly2 = yearly.resample('A').mean()
    
          avSpeed
    2014     50.0
    2015     40.0
    2016      NaN
    2017      NaN
    2018     20.0
    2019     16.0
    
  • 用以下方式绘制steps-post

    plt.figure()
    yearly2['avSpeed'].plot(color='red', drawstyle='steps-post')
    

    在此处输入图像描述

还缺少什么:

  • 主要问题:2019 年的值仅在年初显示。
  • 另外:存在垂直连接线(不需要)。

编辑:解决方案

无需对数据进行上采样,甚至无需使用NaN! hlines我可以像这样绘制数据:

ax=plt.subplot()
ax.hlines(yearly['avSpeed'],  yearly.index.start_time, (yearly.index+1).start_time, 'r') #or: yearly.index.end_time
ax.legend()
plt.show()

在此处输入图像描述

非常感谢@piRSquared 为我指明了正确的方向。

4

2 回答 2

0

由于这只是您遇到问题的最后一个时期,因此只需添加一个偏移量为 1 年且填充有 nan 的新时期即可解决您的问题:

yearly2.loc[yearly2.index[-1] + pd.offsets.YearEnd(1), :] = np.nan

指定pd.offsetwithYearEnd将保留您的PeriodIndex频率,即A-DEC在重新采样/创建PeriodIndexwith 时freq='A'。对于其他周期频率,当然应该使用其他偏移量。

于 2019-04-29T14:16:43.293 回答
0

您可以使用hlinespandas.PeriodIndex属性start_timeend_time

ax = plt.subplot()
ax.hlines(yearly, yearly.index.start_time, yearly.index.end_time, 'r', label='avSpeed')
ax.legend()

在此处输入图像描述

于 2019-04-29T14:45:00.560 回答