Python 如何从pandas dataframe聚合和绘制数据?

Python 如何从pandas dataframe聚合和绘制数据?,python,pandas,dataframe,matplotlib,plot,Python,Pandas,Dataframe,Matplotlib,Plot,我有这个数据框 df[['payout_date','total_value']].head(10) payout_date total_value 0 2017-02-14T11:00:06 177.313 1 2017-02-14T11:00:06 0.000 2 2017-02-01T00:00:00 0.000 3 2017-02-14T11:00:06 47.392 4 2017-02-14T11:00:06 16.254 5

我有这个数据框

df[['payout_date','total_value']].head(10)

    payout_date         total_value
0   2017-02-14T11:00:06  177.313
1   2017-02-14T11:00:06  0.000
2   2017-02-01T00:00:00  0.000
3   2017-02-14T11:00:06  47.392
4   2017-02-14T11:00:06  16.254
5   2017-02-14T11:00:06  125.818
6   2017-02-14T11:00:06  0.000
7   2017-02-14T11:00:06  0.000
8   2017-02-14T11:00:06  0.000
9   2017-02-14T11:00:06  0.000
我使用这段代码按天和按月绘制特定日期范围内的合计值,但它为每个合计值绘制一个条形图,而不是按天合计合计合计值

数据未聚合,我从df获得每个值的条形图:

如何按日期和月份合计总价值

我试着使用其他类似问题的答案,但没有一个适合这里使用的日期格式

我还尝试将.dt.to_period'M'添加到代码中,但我得到了TypeError:Empty'DataFrame':没有要打印的数字数据错误

设置

使用“正常化”仅按天分组:

df.groupby(pd.DatetimeIndex(df.payout_date).normalize()).sum().reset_index()

  payout_date  total_value
0  2017-02-01      199.313
1  2017-02-02       48.000
2  2017-02-14       63.646
3  2017-02-15      210.818
4  2017-02-16       83.000
扩展上一个命令以打印:

df.groupby(
    pd.DatetimeIndex(df.payout_date)      \
    .normalize().strftime('%Y-%m-%d'))    \
    .agg(['sum'])                         \
    .reset_index()                        \
    .plot(x='index', y='total_value', kind='bar')

plt.tight_layout()
plt.show()
我的示例数据的输出:

如果要将此应用于子集,可以执行以下操作:

tmp = df.loc[(df.payout_date > '2017-02-01') & (df.payout_date < '2017-02-15')]

tmp.groupby(
    pd.DatetimeIndex(tmp.payout_date)                     \
    .normalize().strftime('%Y-%m-%d'))['total_value']     \
    .agg(['sum'])

# Result
                sum
2017-02-01  199.313
2017-02-02   25.000
2017-02-14   63.646
这将只对您所需的范围求和。

请尝试以下方法:

df = df.iloc[1:7]
(df.set_index('payout_date')
                .groupby('payout_date')
                .agg(['sum'])
                .reset_index()
                .plot(x='payout_date', y='total_value',kind="bar"))
plt.show()

如果在之前选择了索引

如果删除.loc['2018-02-01':'2018-02-02'],会发生什么?@Joe我尝试过,它计算了非常长的时间>30分钟,我停止了脚本,因为数据帧非常大,所以我必须选择一个特定的间隔。由于行数很少,它可以正确绘制聚合,而不使用loc Try,如果它有效,在输入代码之前进行选择posted@Joe我做了new_df=df。设置了_索引'payout_date'。loc['2018-02-01':'2018-02-02'],然后尝试使用没有.loc的初始代码,但我得到了'keyrerror:'payout_date error',所以在新的_df中没有'payout_date'列?为什么?如何在原始代码之前正确地进行选择?谢谢,我得到了一个很奇怪的结果。“之前选择索引”是什么意思?如何选择索引?还有,df.iloc[1:7]代表什么?它的用途是什么?@user40,df=df.iloc[1:7]您选择行。在本例中,从第1行到第7行。例如,如果希望前1000行更改为df.iloc[0:1000]
tmp = df.loc[(df.payout_date > '2017-02-01') & (df.payout_date < '2017-02-15')]

tmp.groupby(
    pd.DatetimeIndex(tmp.payout_date)                     \
    .normalize().strftime('%Y-%m-%d'))['total_value']     \
    .agg(['sum'])

# Result
                sum
2017-02-01  199.313
2017-02-02   25.000
2017-02-14   63.646
df = df.iloc[1:7]
(df.set_index('payout_date')
                .groupby('payout_date')
                .agg(['sum'])
                .reset_index()
                .plot(x='payout_date', y='total_value',kind="bar"))
plt.show()