这应该很容易,但我有几个问题。问题是,我想做类似 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")
我几乎做到了,但是列日实际上不是天,而是一个数字,代表这一天在一年中的位置,我猜。那么关于如何制作这个情节有什么想法吗?
答案 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")
输出(对于给定的样本数据):
答案 1 :(得分:1)
由于这个问题也有 seaborn
和 plotly
标签,
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()
为了情节取 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()
答案 2 :(得分:0)
你到底想要什么?没有时间的日期? 试试这个:
df["day"] = df["date"].apply(lambda l: l.date())