matplotlib:以人类可读格式绘制毫秒时间序列

matplotlib: plot milliseconds time series in human readable format

我有一个整数列表,表示以毫秒为单位的时间序列。每个值都是通过调用 int(time.time() * 1000) 并附加到列表中获得的。

现在我想使用 matplotlib 制作一个绘图,它将以 "%H:%M:%S".[=14= 格式在 x 轴上显示毫秒时间序列]

我尝试通过设置将这些值与 matplotlib 数据格式化程序一起使用:plt.gca().xaxis.set_major_formatter(dates.DateFormatter("%H:%M:%S")) 但是我在尝试绘制时遇到以下错误:OverflowError: int too big to convert.

我还尝试通过调用 time.strftime('%H:%M:%S', time.gmtime(time.time())) 将已经预格式化的时间序列值用作字符串并附加到列表而不是运气不好,导致这个问题:Using categorical units to plot a全部可解析为浮点数或日期的字符串列表。如果这些字符串应绘制为数字,请在绘制前转换为适当的数据类型。

谁能帮我在 x 轴上以人类可读的格式绘制毫秒?

您可以使用 epoch2num 转换时间值(自 UTC 纪元以来的毫秒数)。然后你可以使用标准 DateFormatter.

import matplotlib.pyplot as plt
import matplotlib as mpl
import time

now_ms = int(time.time() * 1000)
x = [now_ms+t for t in range(0,10_000,1000)]

plt.plot([mpl.dates.epoch2num(t/1000) for t in x], range(10))
plt.gca().xaxis.set_major_formatter(mpl.dates.DateFormatter("%H:%M:%S")) 

你应该使用 matplotlib version 3.3.1 or newer

最简单的方法就是将 datetime64 转换为:

now_ms = int(time.time() * 1000)
x = now_ms+np.arange(0,10_000,1000)
x = x.astype('datetim64[ms]')
plt.plot(x, range(10))