基于起始和结束d的时间序列数据分组

2024-06-10 01:14:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个年度体育锦标赛的时间序列数据,以及每一场比赛的日期。我想把比赛按赛季(年份)分组。每个季节从八月开始,到次年七月结束。在

我该如何按赛季对比赛进行分组- 季节(2016-2017)、季节(2017-2018)等。。在

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场比赛。这是我使用的代码:

^{pr2}$

但我更喜欢更优雅、更包含时间序列数据的数据,这样我就可以继续提问了。在


Tags: 数据代码answerdate可视化时间序列解决方案
3条回答

成功的关键是正确的分组,在您的例子中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'))

如果打印结果:

^{pr2}$

您将获得:

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日开始到结束 七月三十一日。在

你可以对你的团队做任何你想做的事。在

Resampling使用'A-JUL'作为anchored offset alias应该可以做到:

>>> df
            SAMPLE
DATE              
2009-01-30       1
2009-07-10       4
2009-11-20       3
2010-01-01       5
2010-05-13       1
2010-08-01       1
>>> df.resample('A-JUL').sum()
            SAMPLE
DATE              
2009-07-31       5
2010-07-31       9
2011-07-31       1

A表示这是一个年间隔,-JUL表示它在7月结束。在

使用-

df.groupby(df['DATE'].dt.year).count()

输出

^{pr2}$

自定义季节分组

min_year = df['DATE'].dt.year.min()
max_year = df['DATE'].dt.year.max()
rng = pd.date_range(start='{}-07'.format(min_year), end='{}-08'.format(max_year), freq='12M').to_series()
df.groupby(pd.cut(df['DATE'], rng)).count()

输出

    DATE
DATE    
(2009-07-31, 2010-07-31]    3
(2010-07-31, 2011-07-31]    0
(2011-07-31, 2012-07-31]    0
(2012-07-31, 2013-07-31]    0
(2013-07-31, 2014-07-31]    0
(2014-07-31, 2015-07-31]    0
(2015-07-31, 2016-07-31]    0
(2016-07-31, 2017-07-31]    0
(2017-07-31, 2018-07-31]    1

相关问题 更多 >