首页 > 解决方案 > 绘制按多个级别分组的时间序列

问题描述

我有一个具有以下结构的数据集:

df = pd.read_csv('daily-minimum-values.csv', header=0, dtype={'Value':float})
df['Date'] = df['Date'].astype('datetime64[ns]')
df.head()
+------------+-------+
| Date       | Value |
+------------+-------+
| 1990-01-01 | 20.7  |
+------------+-------+
| 1990-01-02 | 17.4  |
+------------+-------+
| 1990-01-03 | 18.1  |
+------------+-------+
| 1990-01-04 | 15.6  |
+------------+-------+
| 1990-01-05 | 12.4  |
+------------+-------+

该数据集是一个包含 1990 年到 2013 年数据的时间序列。我想逐年直观地分析这个时间序列,所以我试图生成一个每年都有多个子图的数字,问题是我会还喜欢在 x 轴上显示季度/月/日或日期,例如:

绘图示例

我需要为 x 轴上的多个聚合级别生成图,所以我尝试了几件事。

df.groupby(pd.Grouper(key='Date', freq='A')).plot(x="Date",y="Value") # Group by year and plot date in x-axes 

它返回多个图,但为了比较目的,一目了然地看到多个图很复杂:

生成的图

我已经尝试在我的数据框中添加两列,预计年份和月份会更容易绘制,但我不明白 matplotlib 的工作原理。

df["year"]=df.Date.dt.year
df["month"]=df.Date.dt.month
df.groupby('year',"month")["Value"].sum().plot(x='month', y='Value')

这会产生以下错误:

ValueError:没有为对象类型命名月份的轴

提前致谢。

标签: pythonpandasmatplotlibplot

解决方案


如果我理解正确,您正在尝试创建Seaborn python 模块支持的多图网格。df给定一个带有时间戳类型的 DataFrame和您希望可视化datetime64[ns]的列中的一些值,您可以拆分时间戳信息,将它们放入名为 的新列中,然后使用函数创建绘图网格。例如,以下 python 代码将为每个月创建一个折线图并将它们放在一系列行中。valuesyearmonthdayFacetGrid

g = seaborn.FacetGrid(df,"month")
g.map(plt.plot,"day","values")

Seaborn 建立在 matplotlib 之上。


推荐阅读