Pandas绘制Timedelta系列,在选定时间使用垂直线

时间:2017-07-21 16:44:58

标签: python pandas matplotlib timedelta

我对这个问题提出了一个非常类似的问题:Pandas graphing a timeseries, with vertical lines at selected dates但解决方案并不适用于Timedelta。

考虑这个系列:

In:
avg_hr[pd.Timedelta(seconds=3)]

Out:
92.9

我可以选择这个系列中的元素:

In:
avg_hr.plot()

我可以生成这样的图表:

In:
plt.axvline(x=pd.Timedelta(seconds=110), color='r', linestyle='dashed', linewidth=2)

Out:
TypeError: Cannot compare type 'Timedelta' with type 'float64'

avg_hr.plot()

但是,我不能用TimeDelta绘制垂直线:

In:
plt.axvline(x=110, color='r', linestyle='dashed', linewidth=2)

但是,如果我使用float或int,则垂直线出现在位置0。

In:
for key in avg_hr.keys():
    ax.axvline(x=key, color='r', linestyle='dashed', linewidth=2)

Out:
TypeError: Cannot compare type 'Timedelta' with type 'float64'

avg_hr.plot()

如何使用此timedelta索引绘制垂直线?

修改

即使我直接使用x轴上使用的键,我也得到了同样的错误:

{{1}}

2 个答案:

答案 0 :(得分:4)

我发现即使我在几秒钟内工作,并且轴标签以秒为单位显示时间,它实际上也是以纳秒为单位!

来自文档Pandas Time Deltas

  

Pandas使用64位表示以纳秒分辨率的Timedeltas   整数

所以,在我的问题的例子中,当我调用它时,垂直线不在位置0,但实际上位于110纳秒(因此非常接近于0):

plt.axvline(x=110, color='r', linestyle='dashed', linewidth=2)

解决方案只是将你的x值转换为纳秒:

x_ns = pd.Timedelta(seconds=110) / pd.Timedelta(1,'ns') #Seconds to nanoseconds
plt.axvline(x=x_ns, color='r', linestyle='dashed', linewidth=2)

当我尝试更改xlim时,我发现了这一点,然后我看到所有内容都缩放到纳秒级。因此,需要将相同的转换应用于xlim。

ax1.set_xlim([0, 110])

enter image description here

结果有多条垂直线

enter image description here

完成:

#Add verticals lines for specific event
plt.axvline(x=pd.Timedelta(seconds=120) / pd.Timedelta(1,'ns'), color='r', linestyle='dashed', linewidth=2)
plt.axvline(x=pd.Timedelta(seconds=185) / pd.Timedelta(1, 'ns'), color='r', linestyle='dashed', linewidth=2)
plt.axvline(x=pd.Timedelta(seconds=210) / pd.Timedelta(1, 'ns'), color='r', linestyle='dashed', linewidth=2)
plt.axvline(x=pd.Timedelta(seconds=225) / pd.Timedelta(1, 'ns'), color='r', linestyle='dashed', linewidth=2)

答案 1 :(得分:0)

我遇到了类似的问题。我使用的TimeDelta索引的解决方案是 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M1</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit-platform</artifactId> <version>3.0.0-M1</version> </dependency> </dependencies> </plugin> 属性,该属性以秒为单位返回float。 (“ timedelta的总持续时间,以秒为单位(至ns精度)”)

所以

total_seconds

应该可以解决问题。