如何在python中绘制时间序列

Moh*_*dar 43 python plot matplotlib

我一直试图从CSV文件中绘制时间序列图.我已经设法读取文件并使用字符串将数据从字符串转换为日期strptime.当我尝试使用包含日期信息的列表在matplotlib中绘制测试图时,它将日期绘制为一系列点; 也就是说,对于2012年5月31日19:00的日期,我在y轴上获得了2012,05,19,31,00处的点的图,其中x = 1的值等等.我知道这不是传递绘图日期信息的正确方法.有人能告诉我如何正确传递这些信息.

jab*_*edo 97

将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)
Run Code Online (Sandbox Code Playgroud)

这是一个有一个日期时间数组后如何绘制数据的示例:

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 如果您觉得答案有用,那么在SO中表示感谢的方式是通过upvoting/acceptting(点击向上键或检查)答案:) (7认同)
  • 谢谢。我使用 time.srtptime() 而不是 datetime.strptime() ,这导致了问题 (2认同)
  • @jabaldonedo然后我会投票给你.不错的头像顺便说一句:) (2认同)
  • 如何每隔 00:00:00 画一条垂直线? (2认同)

cot*_*ail 6

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
Run Code Online (Sandbox Code Playgroud)

如果将 csv 文件读入 pandas 数据帧,请使用pd.to_datetime()转换为日期时间。例如,

df = pd.DataFrame({'date': x, 'value': y, 'value2': z})
df['date'] = pd.to_datetime(df['date'])                     # convert to datetime
Run Code Online (Sandbox Code Playgroud)

2. 按日期排序

为了制作可读的绘图,重要的是对数据进行排序(按日期)。例如,xy#1 中的示例所示,在左侧绘制图表,而按x升序排序的相同数据在右侧绘制图表。

排序与未排序

xs, ys = zip(*sorted(zip(x, y)))                 # sort by date
plt.plot(xs, ys);
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

4、等间隔画垂直线

Matplotlib 的dates模块具有方便的函数,可以将数字转换为日期时间,反之亦然,将日期格式化为特定字符串等。

一种方法是使用该模块检测主要刻度位置(也可能包括次要刻度,具体取决于刻度标签的粒度)matplotlib.dates,然后在主要刻度位置绘制网格线。

from datetime import datetime
import matplotlib.dates as mdates

plt.plot(xs, ys)

pos = mdates.YearLocator()                    # detect tick locations by year
fmt = mdates.DateFormatter('%Y-%m-%d')        # format the datetime with '%Y-%m-%d
plt.gca().xaxis.set(major_locator=pos, major_formatter=fmt)
plt.grid(axis='x')
Run Code Online (Sandbox Code Playgroud)

时间序列图

另一种方法是在时间序列图的顶部绘制垂直线。由于 x-tick 位置是 matplotlib 图中的数字,因此我们可以使用matplotlib.dates.num2date()方法将它们转换为日期,并使用这些日期绘制特定日期时间的垂直线。例如,要为每年的 1 月 1 日 00:00:00 绘制一条垂直线,请使用 x-limits 获取年份并创建 1 月 1 日的新日期时间。

# plot time-series
plt.plot(xs, ys)

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

# show datetimes in a specific format
pos = mdates.YearLocator()                   # 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)
Run Code Online (Sandbox Code Playgroud)