在matplotlib中绘制日期与时间的关系图

7 投票
2 回答
16192 浏览
提问于 2025-04-16 10:34

我想要在图表上画出日期和一天中的时间,日期放在横轴,时间放在纵轴,然后可以选择用折线图或者浮动条图来展示。

这个回答对我有帮助

不过,我的需求和那个图有些不同,我现在的纵轴上同时显示了日期和时间,这样就把几个月的时间戳挤在了一起,而我其实只需要一天的时间数据。那个例子里有人在评论中说“纵轴的基准日期可以是任何日期,因为信息在时间里”,但我不太明白他是怎么“丢掉”基准日期的信息的。

总之,我的需求是:

  1. 我希望纵轴可以选择24小时制(00:00到24:00)或者上午/下午制的时间格式,刻度显示像3:00pm、11:00am这样的样子。我想这可以用FuncFormatter来实现。

  2. 对于时间区间,我不想用误差条,因为那样的线太细了。我想用浮动条或者柱状图来展示。

我的数据是这种格式的日期时间字符串:'2010-12-20 05:00:00'

谢谢大家的帮助。

2 个回答

2

跟着Joe Kingston的回答,但我想补充一点,你需要把你的日期字符串转换成日期时间对象,这个可以很简单地通过datetime模块来实现,然后再把它们转换成matplotlib可以用的日期格式,表示为浮点数(这样你就可以根据需要进行格式化)。

import datetime as dt
import matplotlib as mpl

some_time_str = '2010-12-20 05:00:00'
some_time_dt = dt.datetime.strptime(some_time_str, '%Y-%m-%d %H:%M:%S')
some_time_num = mpl.dates.date2num(some_time_dt) # 734126.20833333337

如果你一开始有一个装满时间字符串的数组,你可以这样做:

time_str_list = ['2010-12-20 05:00:00','2010-12-20 05:30:00']
time_num_list = map(
    lambda x: mpl.dates.date2num(dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')),
    time_str_list) #[734126.20833333337, 734126.22916666663]
13

我觉得你可能对matplotlib是怎么处理时间和日期的有点困惑。

在matplotlib中,所有的日期时间其实都是用简单的浮点数来表示的。比如说,1天就对应1.0的差值,而日期是从1900年开始计算的天数(我记得没错的话)。

所以,如果你想要只画出某个日期的时间,你需要用到% 1

我这里用的是点的形式,但你也可以很容易地用条形图。如果你用plt.bar,可以看看bottom这个参数,这样条形图的底部就会从你设定的时间开始(记得第二个参数是条形的高度,而不是它的顶部y值)。

举个例子:

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import datetime as dt

# Make a series of events 1 day apart
x = mpl.dates.drange(dt.datetime(2009,10,1), 
                     dt.datetime(2010,1,15), 
                     dt.timedelta(days=1))
# Vary the datetimes so that they occur at random times
# Remember, 1.0 is equivalent to 1 day in this case...
x += np.random.random(x.size)

# We can extract the time by using a modulo 1, and adding an arbitrary base date
times = x % 1 + int(x[0]) # (The int is so the y-axis starts at midnight...)

# I'm just plotting points here, but you could just as easily use a bar.
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot_date(x, times, 'ro')
ax.yaxis_date()
fig.autofmt_xdate()

plt.show()

时间与日期

希望这能帮到你一点!

撰写回答