python - 绘制按多个级别分组的时间序列
问题描述
我有一个具有以下结构的数据集:
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:没有为对象类型命名月份的轴
- matplotlib 和 pandas 如何满足此要求?
- 如何获得所需的地块?
提前致谢。
解决方案
如果我理解正确,您正在尝试创建Seaborn python 模块支持的多图网格。df
给定一个带有时间戳类型的 DataFrame和您希望可视化datetime64[ns]
的列中的一些值,您可以拆分时间戳信息,将它们放入名为 的新列中,然后使用函数创建绘图网格。例如,以下 python 代码将为每个月创建一个折线图并将它们放在一系列行中。values
year
month
day
FacetGrid
g = seaborn.FacetGrid(df,"month")
g.map(plt.plot,"day","values")
Seaborn 建立在 matplotlib 之上。