我对这个问题提出了一个非常类似的问题: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'
但是,我不能用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'
如何使用此timedelta索引绘制垂直线?
修改
即使我直接使用x轴上使用的键,我也得到了同样的错误:
{{1}}
答案 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])
结果有多条垂直线
完成:
#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
应该可以解决问题。