tl;博士:如何在绘制时间序列时跳过没有数据的时段?
我正在运行一个很长的计算,我想监控它的进度。有时我会打断这个计算。日志存储在一个巨大的 CSV 文件中,如下所示:
2016-01-03T01:36:30.958199,0,0,0,startup
2016-01-03T01:36:32.363749,10000,0,0,regular
...
2016-01-03T11:12:21.082301,51020000,13402105,5749367,regular
2016-01-03T11:12:29.065687,51030000,13404142,5749367,regular
2016-01-03T11:12:37.657022,51040000,13408882,5749367,regular
2016-01-03T11:12:54.236950,51050000,13412824,5749375,shutdown
2016-01-03T19:02:38.293681,51050000,13412824,5749375,startup
2016-01-03T19:02:49.296161,51060000,13419181,5749377,regular
2016-01-03T19:03:00.547644,51070000,13423127,5749433,regular
2016-01-03T19:03:05.599515,51080000,13427189,5750183,regular
...
实际上,有 41 列。每一列都是进度的特定指标。第二列总是以 10000 的步长递增。最后一列是不言自明的。
我想在同一图表上绘制每一列,同时跳过“关闭”和“启动”之间的时段。理想情况下,我还想在每个跳过上画一条垂直线。
这是我到目前为止所得到的:
import matplotlib.pyplot as plt
import pandas as pd
# < ... reading my CSV in a Pandas dataframe `df` ... >
fig, ax = plt.subplots()
for col in ['total'] + ['%02d' % i for i in range(40)]:
ax.plot_date(df.index.values, df[col].values, '-')
fig.autofmt_xdate()
plt.show()
我想摆脱那个漫长的平坦时期,而只是画一条垂直线。
我知道df.plot()
,但根据我的经验,它已经坏了(除其他外,Pandasdatetime
以自己的格式转换对象,而不是使用date2num
and num2date
)。
看起来一个可能的解决方案是编写一个自定义缩放器,但这似乎很复杂。
据我了解,编写自定义Locator
只会更改刻度线的位置(小垂直线和相关标签),但不会更改绘图本身的位置。那是对的吗?
UPD:一个简单的解决方案是更改时间戳(例如,将它们重新计算为“自开始以来经过的时间”),但我更愿意保留它们。
UPD:https ://stackoverflow.com/a/5657491/1214547的答案对我有一些修改。我会尽快写出我的解决方案。