У меня есть датафрейм, аналогичный приведенному ниже:
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 моего метода?