matplotlib 如何在Python中绘制时间序列

zkure5ic  于 2023-03-30  发布在  Python
关注(0)|答案(2)|浏览(211)

我一直试图从CSV文件中绘制一个时间序列图。我设法读取该文件,并使用strptime将数据从字符串转换为日期,并存储在列表中。当我试图在matplotlib中绘制一个测试图时,列表包含日期信息,它将日期绘制为一系列点;也就是说,对于日期2012-may-31 19:00,我得到了一个在y轴上2012, 05, 19, 31, 00处有一个点的图,用于x=1的值等。我明白这不是传递日期信息的正确方法。有人能告诉我如何正确传递此信息吗?

0sgqnhkj

0sgqnhkj1#

将x轴数据从文本转换为datetime.datetime,使用datetime.strptime

>>> from datetime import datetime
>>> datetime.strptime("2012-may-31 19:00", "%Y-%b-%d %H:%M")
 datetime.datetime(2012, 5, 31, 19, 0)

这是一个如何在拥有datetime数组后绘制数据的示例:

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

x = np.array([datetime.datetime(2013, 9, 28, i, 0) for i in range(24)])
y = np.random.randint(100, size=x.shape)

plt.plot(x,y)
plt.show()

vfh0ocws

vfh0ocws2#

1.确保数据为datetime(或datetime64

绘制时间序列数据的一个常见问题是,数据通常不是datetime类型,而是类似于日期时间的字符串(如"2023-03-23 07:13:13"),如果数据是从文件中读取的,这种情况尤其常见。

from datetime import datetime

x = ['2023-03-25 04:11:37', '2020-03-23 08:11:37', '2019-11-23 01:07:17', '2024-03-25 23:17:37', '2021-03-22 16:27:37']
y = [8.55, 6.55, 4.63, 10.46, 7.35]
z = [9.86, 4.95, 0.5, 6.35, 8.43]
x = [datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in x]  # convert to datetime

如果csv文件被读入pandas dataframe,使用pd.to_datetime()转换为datetime。例如,

df = pd.DataFrame({'date': x, 'value': y, 'value2': z})
df['date'] = pd.to_datetime(df['date'])                     # convert to datetime
2.按日期排序

为了制作一个可读的图,重要的是数据被排序(按日期)。例如,在#1中的示例中给出的xy在左边绘制图形,而按升序排序的x在右边绘制图形。

xs, ys = zip(*sorted(zip(x, y)))                 # sort by date
plt.plot(xs, ys);
3.绘制多个时间序列

要在同一个图上绘制多个时间序列,只需调用plt.plot两次。

xs, ys, zs = zip(*sorted(zip(x, y, z)))
plt.plot(xs, ys, label='y over time', color='blue')
plt.plot(xs, zs, label='z over time', color='red')
plt.legend();
4.均匀间隔画竖线

Matplotlib有dates模块,它有一些方便的函数,可以将数字转换为日期时间,反之亦然,用字符串格式化日期等。由于x-tick位置在matplotlib图中是数字,我们可以使用matplotlib.dates.num2date()方法将它们转换为日期,并使用这些日期绘制特定日期时间的垂直线。例如,要绘制每年1月1日00:00:00的垂直线,使用x-limits获取年份并创建1月1日的新日期时间。
matplotlib.dates也可用于将日期格式化为特定字符串。

from datetime import datetime
import matplotlib.dates as mdates

plt.plot(xs, ys)
xmin, xmax = map(mdates.num2date, plt.xlim())               # get dates on x-limits as dates
for yr in range(xmin.year, xmax.year):
    plt.axvline(datetime(yr + 1, 1, 1), color='gray')       # vertical line on Jan 1 midnight

# show datetimes in a specific format
pos = mdates.AutoDateLocator()                   # detect tick locations automatically
fmt = mdates.DateFormatter('%Y-%m-%d')           # format the datetime with '%Y-%m-%d
plt.gca().xaxis.set(major_locator=pos, major_formatter=fmt)

# if the tick labels are too crowded, keep only a few of them
pos, labels = plt.xticks()                       # get xtick positions and labels
plt.xticks(pos[::2], labels[::2]);               # keep only every second tick

相关问题