在 matplotlib 中绘制 unix 时间戳

问题描述 投票:0回答:2

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

我已阅读有关使用日期时间对象进行绘图的答案,但此方法似乎删除了小时/分钟/秒信息和全天的轨道时间戳。有没有办法生成这些图并显示更细粒度的标签?

python matplotlib
2个回答
98
投票

可以调用

plt.plot(dates,values)
,其中
dates
datetime.datetime
对象的列表。该图将包含
'%Y-%m-%d'
格式的 xticks,当您放大时,会自动更改为显示小时、分钟、秒的格式。

但是,听起来您想要更多的控制权。也许它没有按照您希望的比例显示小时、分钟、秒。

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

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

不幸的是,如果将

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()

alt text

然后你会得到格式良好的日期,但所有 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()

alt text


0
投票

从这里:https://matplotlib.org/stable/api/dates_api.html#matplotlib.dates.DateFormatter

import datetime
import matplotlib.dates as mdates

base = datetime.datetime(2005, 2, 1)
dates = np.array([base + datetime.timedelta(hours=(2 * i))
                  for i in range(732)])
N = len(dates)
np.random.seed(19680801)
y = np.cumsum(np.random.randn(N))

fig, ax = plt.subplots(constrained_layout=True)
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)

ax.plot(dates, y)
ax.set_title('Concise Date Formatter')
© www.soinside.com 2019 - 2024. All rights reserved.