Pandas 多个时间序列绘制单个数据帧

Posted

技术标签:

【中文标题】Pandas 多个时间序列绘制单个数据帧【英文标题】:Pandas Multiple Time Series Plots Single Data Frame 【发布时间】:2022-01-06 15:15:42 【问题描述】:

鉴于以下pandasDataFrame,显示具有每个名称类别的离散时间桶的时间序列图的惯用方式是什么?

Name Type
time datetime64
name object
value float64

我当前的解决方案需要一个循环来提取 DataFrame 并为每个名称类别计算 max 聚合。

import pandas as pd
import matplotlib.pyplot as plt

raw_df = pd.read_csv('...')
raw_df['time'] = raw_df['time'].astype('datetime64[ns]')

names = raw_df['name'].unique()
names.sort()

fig, ax = plt.subplots()

for name in names:
    df = raw_df.query(f'name == "name"').set_index('time').resample('10T').max()
    df.plot(ax = ax, label=name)

【问题讨论】:

sns.lineplot(data=raw_df, x='time', y='value', hue='name') seaborn 是 matplotlib 的高级 api 【参考方案1】:

你可以使用:

df.pivot(index='time', values='value', columns='name').resample('10Y').max().plot(subplots=True)

例子:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(
    'name': np.append(np.repeat('a', 50), np.repeat('b', 50)),
    'time': pd.to_datetime(2 * pd.date_range(start='1950-01-01', periods=50, freq='Y').values.tolist()),
    'value': np.append(np.cumsum(np.random.lognormal(0, 1, 50)), np.cumsum(np.random.lognormal(0, 1, 50)))
)

df.pivot(index='time', values='value', columns='name').resample('10Y').max().plot(subplots=True)

另见this answer。

【讨论】:

以上是关于Pandas 多个时间序列绘制单个数据帧的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将多个数据帧与时间戳索引对齐

在一张图中绘制多个 pandas 数据框

Pandas:使用循环和分层索引将多个 csv 文件导入数据帧

使用单个数据帧的多个标签调整图例 Seaborn 联合图

使用分块将 CSV 文件读入 Pandas 数据帧,生成单个目标数据帧

Pandas 在单个条形图上绘制多列 [重复]