在matplotlib中绘制unix时间戳

Mat*_*att 42 python matplotlib

我想用python的matplotlib模块制作一个通用值-vs-时间图.我的时间是在unix时间,但我希望它们在图的x轴上以可读格式显示.

我已经阅读了关于使用datetime对象进行绘图的答案,但是这种方法似乎可以删除小时/分钟/秒信息并将时间戳记移动到一整天.有没有办法生成这些图并显示更细粒度的标签?

unu*_*tbu 69

它可以调用plt.plot(dates,values)dates被列表datetime.datetime对象.该图将包括xticks的格式'%Y-%m-%d'和放大时的格式,自动更改为显示小时,分钟,秒的格式.

然而,听起来你需要更多的控制权.也许它没有显示你想要的规模的小时,分​​钟,秒.

在这种情况下,您可以设置自己的日期格式化程序:

ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果你传递datetime.datetime对象plt.plot,matplotlib自动选择的xticks似乎总是有秒等于零.例如,如果你跑

import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time

n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(dates,values)
plt.show()
Run Code Online (Sandbox Code Playgroud)

替代文字

然后你得到格式很好的日期,但所有的xtick秒都是零.

那么解决方案是什么?

如果您自己转换时间戳 - > datetime.datetime对象 - > matplotlib datenums,并将datenums传递给plt.plot,则保留秒数.

PS."matplotlib datenum"是指返回的数字matplotlib.dates.date2num.

import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time

n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
datenums=md.date2num(dates)
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(datenums,values)
plt.show()
Run Code Online (Sandbox Code Playgroud)

替代文字

  • 很好的例子!对于它的价值而言,并不是因为'date2num`的转换而丢失了秒.这是tick定位器自动选择刻度标签的第二个位置. (3认同)