Группировка данных по таймфреймам, упомянутым в Pandas - PullRequest
1 голос
/ 19 июня 2019

У меня есть датафрейм, аналогичный приведенному ниже:

   detaildate   detailquantity
0   5/6/2014    8550
1   5/8/2014    0
2   3/3/2015    -3250
3   4/14/2015   -3250
4   5/19/2015   3250
5   5/20/2015   -1200
6   2/22/2016   40000
7   4/23/2016   -4500
8   5/23/2016   -2500
9   5/30/2016   -5000
10  4/3/2017    -4750
11  6/5/2017    -2000

Теперь я хочу сгруппировать эти данные по какому-то временному интервалу. Например, если я группирую это ежегодно, я хочу результат ниже:

   detaildate   detailquantity
0   5/6/2014    8550
1   5/8/2014    0
   detaildate   detailquantity
0   3/3/2015    -3250
1   4/14/2015   -3250
2   5/19/2015   3250
3   5/20/2015   -1200
   detaildate   detailquantity
0   2/22/2016   40000
1   4/23/2016   -4500
2   5/23/2016   -2500
3   5/30/2016   -5000
   detaildate   detailquantity
0   4/3/2017    -4750
1   6/5/2017    -2000

Я написал для него следующий код:

S = pd.to_datetime(df.detaildate)
for i, g in df.groupby([(S - S[0]).astype('timedelta64[Y]')]):
    print (g.reset_index(drop=True))

Но вместо группировки по календарному году он группируется по 1 году с даты начала. Результат, который я получаю:

   detaildate   detailquantity
0   5/6/2014    8550
1   5/8/2014    0
2   3/3/2015    -3250
3   4/14/2015   -3250
   detaildate   detailquantity
0   5/19/2015   3250
1   5/20/2015   -1200
2   2/22/2016   40000
3   4/23/2016   -4500
   detaildate   detailquantity
0   5/23/2016   -2500
1   5/30/2016   -5000
2   4/3/2017    -4750
   detaildate   detailquantity
0   6/5/2017    -2000

Как мне решить эту проблему?

Кроме того, я хочу написать приведенный выше код в методе и сохранить временные рамки (M, Y, W, D) в качестве параметров. Примерно так:

def groupData(df,timeFrame):
    S = pd.to_datetime(df.detaildate)
    #pass timeFrame as parameter below instead of hardcoded Y
    for i, g in df.groupby([(S - S[0]).astype('timedelta64[Y]')]):
        print (g.reset_index(drop=True))

Как заменить указанный выше жесткий код Y параметром timeFrame моего метода?

1 Ответ

0 голосов
/ 19 июня 2019

Использование series.dt.year() под groupby:

#df.detaildate=pd.to_datetime(df.detaildate)
for i,g in df.groupby(df.detaildate.dt.year):
    print(g.reset_index(drop=True))

   detaildate  detailquantity
0 2014-05-06            8550
1 2014-05-08               0
  detaildate  detailquantity
0 2015-03-03           -3250
1 2015-04-14           -3250
2 2015-05-19            3250
3 2015-05-20           -1200
  detaildate  detailquantity
0 2016-02-22           40000
1 2016-04-23           -4500
2 2016-05-23           -2500
3 2016-05-30           -5000
  detaildate  detailquantity
0 2017-04-03           -4750
1 2017-06-05           -2000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...