我有这个数据框
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
我正在使用此代码在特定日期范围内按天(和按月)绘制total_value
的汇总总和,但是它会为每个total_value
绘制一个条形,而不是总和 - 每天汇总total_value
。
(df.set_index('payout_date')
.loc['2018-02-01':'2018-02-02']
.groupby('payout_date')
.agg(['sum'])
.reset_index()
.plot(x='payout_date', y='total_value',kind="bar"))
plt.show()
数据未汇总,我从df得到每个值的条形码:
如何按日期和按月汇总total_value
?
我尝试使用this的答案并结合其他类似的问题,但没有一个适用于此处使用的日期格式。
我也尝试在代码中添加.dt.to_period('M')
,但我收到TypeError: Empty 'DataFrame': no numeric data to plot
错误。
答案 0 :(得分:1)
<强> 设置 强>
df = pd.DataFrame({'payout_date': {0: '2017-02-01T11:00:06', 1: '2017-02-01T11:00:06', 2: '2017-02-02T00:00:00', 3: '2017-02-14T11:00:06', 4: '2017-02-14T11:00:06', 5: '2017-02-15T11:00:06', 6: '2017-02-15T11:00:06', 7: '2017-02-16T11:00:06', 8: '2017-02-16T11:00:06', 9: '2017-02-16T11:00:06'}, 'total_value':{0: 177.313, 1: 22.0, 2: 25.0, 3: 47.391999999999996, 4: 16.254, 5: 125.818, 6: 85.0, 7: 42.0,8: 22.0, 9: 19.0}})
使用 normalize
按天分组:
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
将上一个命令扩展为plot:
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
只会将您想要的范围加起来。
答案 1 :(得分:0)
尝试这种方式:
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()
在
之前选择索引的位置