如何用熊猫绘制每日平均值?

时间:2021-07-11 13:40:37

标签: python pandas matplotlib seaborn

这应该很容易,但我有几个问题。问题是,我想做类似 this post 的事情,但是 (1) 我有一个日期时间字段,所以我的日期列中有小时、分钟和秒,(2) 我想绘制一个折线图每天。

所以,这是我的数据:

date                   col1        col2
2020-01-01 00:01:020   20          500
2020-01-02 00:01:020   10          500
2020-01-02 00:01:000   20          500
2020-01-02 00:01:021   20          500
2020-02-05 20:11:010   30          500
2020-02-05 10:01:020   10          500
.
.
.

所以,正如我上面提到的,我想要的是绘制 col1 的日平均值。 我从这个开始:

df.groupby('date')['col1'].mean()

由于小时、分钟和秒,这不起作用。 后来,我尝试了这个:

df["day"] = df["date"].dt.day
df.groupby("day")["col1"].mean().plot(kind="line")

我几乎做到了,但是列日实际上不是天,而是一个数字,代表这一天在一年中的位置,我猜。那么关于如何制作这个情节有什么想法吗?

3 个答案:

答案 0 :(得分:2)

IIUC:

groupby 日期而不是日期:

df.groupby(df['date'].dt.date)["col1"].mean().plot(kind="line",rot=25)
#you don't need to create a column date for this directly pass date in groupby()

df.groupby(df['date'].dt.normalize())["col1"].mean().plot(kind="line",rot=25)

可选(您也可以通过这两个来执行此操作,但上面两个最适合您的数据和条件,因为下面的将创建不必要的日期和 NaN):

#via pd.Grouper():
df.groupby(pd.Grouper(key='date',freq='1D'))["col1"].mean().dropna().plot(kind="line")
#OR
#via dt.floor():
df.groupby(df['date'].dt.floor('1D'))["col1"].mean().dropna().plot(kind="line")

输出(对于给定的样本数据):

enter image description here

答案 1 :(得分:1)

由于这个问题也有 seabornplotly 标签,

sns.lineplot 执行此操作不需要 groupby mean 作为默认估计器将计算每个 x 实例的平均值。删除错误阴影集 ci=None

导入和设置:

import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt

df = pd.DataFrame({
    'date': ['2020-01-01 00:01:020', '2020-01-02 00:01:020',
             '2020-01-02 00:01:000', '2020-01-02 00:01:021',
             '2020-02-05 20:11:010', '2020-02-05 10:01:020'],
    'col1': [20, 10, 20, 20, 30, 10],
    'col2': [500, 500, 500, 500, 500, 500]
})
df['date'] = pd.to_datetime(df['date'])

绘图代码:

# Seaborn Line Plot x is the date, y is col1 default estimator is mean
ax = sns.lineplot(data=df, x=df['date'].dt.date, y='col1', ci=None)
ax.tick_params(axis='x', rotation=45)  # Make X ticks easier to read
plt.tight_layout()
plt.show()

plot 1 seaborn


为了情节取 groupby mean 并创建一个 px.line

导入和设置:

import pandas as pd
import plotly.express as px

df = pd.DataFrame({
    'date': ['2020-01-01 00:01:020', '2020-01-02 00:01:020',
             '2020-01-02 00:01:000', '2020-01-02 00:01:021',
             '2020-02-05 20:11:010', '2020-02-05 10:01:020'],
    'col1': [20, 10, 20, 20, 30, 10],
    'col2': [500, 500, 500, 500, 500, 500]
})
df['date'] = pd.to_datetime(df['date'])

绘图代码:

plot_values = df.groupby(df['date'].dt.date)["col1"].mean()
fig = px.line(plot_values)
fig.show()

plot 2

答案 2 :(得分:0)

你到底想要什么?没有时间的日期? 试试这个:

df["day"] = df["date"].apply(lambda l: l.date())