DataFrame类型数据——统计每年每月销量
1. 统计每一年每个月的销售量
从Excel中导入数据,为DataFrame格式
import pandas as pd
df = pd.DataFrame(pd.read_excel(filename)) # 导入数据表
print(df)
我的数据内容如下:日期和销量(销售量2014-08到2015-09的记录)
日期 销量
0 2014-08-02 2261.7
1 2014-08-03 3436.4
2 2014-08-04 2993.0
3 2014-08-05 2618.1
4 2014-08-06 2915.8
5 2014-08-07 2759.1
6 2014-08-08 2900.6
.. ... ...
408 2015-09-25 4854.0
409 2015-09-26 4088.0
410 2015-09-27 3183.0
411 2015-09-28 2976.0
412 2015-09-29 2130.0
413 2015-09-30 2622.0
这里单个日期的类型为Timestamp
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
想要统计月销售量,因为涉及到不同的年份(2015、2014年)直接用groupby()
,会出现将所有年份的相同月份的销量相加起来(比如2015年9月的销量和2014年9月的销量是叠加在一起了)。
print(df.groupby(df['日期'].apply(lambda x:x.month)).sum())
本应该计算出14个月的销量,最后只有12个月的。
2. 解决办法
- 将日期由年月日的格式通过strftime(’%Y/%m’)设置为年月,方便计算
- 注意是对DataFrame中日期的每一个值重新设置格式
df['日期'].apply(lambda x:x.strftime('%Y/%m'))
- 在1的基础上,对DataFrame类型的数据使用groupby()进行分组,分组依据是年月
df.groupby(df['日期'].apply(lambda x:x.strftime('%Y/%m')))
- 在2的基础上对分组后的数据用 sum() 进行统计
df.groupby(df['日期'].apply(lambda x:x.strftime('%Y/%m'))).sum()
得到的结果是
销量
日期
2014/08 86102.20
2014/09 87786.04
2014/10 79425.30
2014/11 72704.50
2014/12 72073.30
2015/01 74912.70
2015/02 77987.90
2015/03 110946.00
2015/04 107800.00
2015/05 109991.00
2015/06 94120.00
2015/07 102977.00
2015/08 98079.00
2015/09 118306.00
3. 总结
含有年月日具体日期的的日销售量,将其统计为月销售量,可以通过strftime(’%Y/%m’) 将其设置为年月,这样更方便统计