我有每年一次体育比赛的时间序列数据,其中包含每场比赛的日期.我想按游戏的季节(年)对游戏进行分组.每个季节都从8月开始,到7月结束.
我将如何按季节对游戏进行分组,例如-
季节(2016-2017),季节(2017-2018)等.
涉及df.resample()的This Answer可能是相关的,但是我不确定如何去做.
日期列如下所示:
DATE
26/09/09
04/10/09
17/10/09
25/10/09
31/10/09
...
29/09/18
07/10/18
28/10/18
03/11/18
我想按季节分组,以便可以对汇总数据执行可视化操作.
更新:目前我的解决方案是将数据帧分为32组,因为我知道每个赛季都有32场比赛.这是我使用的代码:
split_df = np.array_split(df, np.arange(0, len(df),32))
但是,我宁愿选择更优雅,更包含时间序列数据的内容,因此我将继续讨论这个问题.
解决方法:
成功的关键是适当的分组,在您的情况下为pd.Grouper(key =’DATA’,freq =’AS-AUG’).
请注意,freq =’AS-AUG’指出您的群组应从
每年八月.
看下面的脚本:
import pandas as pd
# Source columns
dates = [ '01/04/09', '31/07/09', '01/08/09', '26/09/09', '04/10/09', '17/12/09',
'25/01/10', '20/04/10', '31/07/10', '01/08/10', '28/10/10', '03/11/10',
'25/12/10', '20/04/11', '31/07/11' ]
scores_x = np.random.randint(0, 20, len(dates))
scores_y = np.random.randint(0, 20, len(dates))
# Source DataFrame
df = pd.DataFrame({'DATA': dates, 'SCORE_X': scores_x, 'SCORE_Y': scores_y})
# Convert string date to datetime
df.DATA = pd.to_datetime(df.DATA, format='%d/%m/%y')
# Groupping
gr = df.groupby(pd.Grouper(key='DATA', freq='AS-AUG'))
如果您打印结果:
for name, group in gr:
print()
print(name)
print(group)
你会得到:
2008-08-01 00:00:00
DATA SCORE_X SCORE_Y
0 2009-04-01 16 11
1 2009-07-31 10 7
2009-08-01 00:00:00
DATA SCORE_X SCORE_Y
2 2009-08-01 19 6
3 2009-09-26 14 5
4 2009-10-04 8 11
5 2009-12-17 12 19
6 2010-01-25 0 0
7 2010-04-20 17 6
8 2010-07-31 18 2
2010-08-01 00:00:00
DATA SCORE_X SCORE_Y
9 2010-08-01 15 18
10 2010-10-28 2 4
11 2010-11-03 8 16
12 2010-12-25 13 1
13 2011-04-20 19 7
14 2011-07-31 8 3
如您所见,每个组仅在8月1日开始,并在8月1日结束
7月31日.
您可以随心所欲地与您的小组一起做.
标签:pandas,python
来源: https://codeday.me/bug/20191024/1923762.html