2016-08-24 7 views
2

'관심있는 두 열 (타임 스탬프)이있는 데이터가 있습니다 :'라벨 '과 수입니다. 나는 말, 하루 당 레이블 당 합계를 가진 시계열을 만들고 싶습니다. 이 문제를 해결하기 위해 resample을 사용할 수 있습니까?팬더로 '깔끔한'데이터 프레임 재 샘플

구체 예 :이 예

import pandas as pd 
import numpy as np 
from itertools import cycle 

idx = pd.date_range('2016-01-01', '2016-01-07', freq='H') 
n = np.random.randint(10, size=24*6+1) 
lst = [(l,c) for l,c in zip(cycle(['foo', 'bar']), n)] 
df = pd.DataFrame(lst, index=idx, columns=['label', 'n']) 

df.resample(???).sum() 

는 대상 데이터 프레임 시간 인덱스 간격 당 총 수를 포함하는 두 개의 컬럼 (foobar)를 포함한다.

답변

2

난 당신이 필요하다고 생각 groupbyDataFrameGroupBy.resample과 :

print (df.groupby('label') 
     .resample('1D') 
     .sum() 
     .reset_index() 
     .rename(columns={'level_1':'date'})) 

    label  date n 
0 bar 2016-01-01 44 
1 bar 2016-01-02 60 
2 bar 2016-01-03 65 
3 bar 2016-01-04 51 
4 bar 2016-01-05 37 
5 bar 2016-01-06 59 
6 foo 2016-01-01 40 
7 foo 2016-01-02 69 
8 foo 2016-01-03 58 
9 foo 2016-01-04 55 
10 foo 2016-01-05 67 
11 foo 2016-01-06 59 
12 foo 2016-01-07 5 

datetimeindex 작업을위한 stackunstack 또 다른 솔루션 :

print (df.set_index('label', append=True) 
     .unstack(1) 
     .resample('1D') 
     .sum() 
     .stack() 
     .reset_index() 
     .rename(columns={'level_0':'date'})) 

     date label  n 
0 2016-01-01 bar 44.0 
1 2016-01-01 foo 40.0 
2 2016-01-02 bar 60.0 
3 2016-01-02 foo 69.0 
4 2016-01-03 bar 65.0 
5 2016-01-03 foo 58.0 
6 2016-01-04 bar 51.0 
7 2016-01-04 foo 55.0 
8 2016-01-05 bar 37.0 
9 2016-01-05 foo 67.0 
10 2016-01-06 bar 59.0 
11 2016-01-06 foo 59.0 
12 2016-01-07 foo 5.0 

만약 필요 두 개의 열 :

df1 = df.set_index('label', append=True).unstack(1).resample('1D').sum() 
df1.columns = df1.columns.droplevel(0) 
print (df1) 
label  bar foo 
2016-01-01 61.0 65.0 
2016-01-02 54.0 56.0 
2016-01-03 70.0 53.0 
2016-01-04 46.0 49.0 
2016-01-05 61.0 49.0 
2016-01-06 50.0 55.0 
2016-01-07 NaN 6.0 
+0

내가 한 가능할 것으로 기대하지 않는다. 매우 강력한'groupby'로'resample'을 묶는 것입니다. 보조 노트로 TimeGrouper를 사용하여 세 번째 방법을 알아 냈습니다.'df.groupby ([pd.TimeGrouper ('W'), 'label'])'. –

관련 문제