2016-07-10 4 views
0

Grouper에서 시작 시간을 어떻게 조정합니까?인덱스 값을 시작하여 Pandas Groupby/Grouper 그룹

이 샘플 DF 시작 :

import datetime as DT 
df = pd.DataFrame({ 
'Buyer': 'Carl Mark Carl Joe Joe Carl'.split(), 
'Quantity': [1,3,5,8,9,3], 
'Date' : [ 
DT.datetime(2013,1,1,13,0), 
DT.datetime(2013,3,1,13,5), 
DT.datetime(2013,5,1,20,0), 
DT.datetime(2013,8,2,10,0), 
DT.datetime(2013,9,2,12,0),          
DT.datetime(2013,11,2,14,0), 
]}) 
df = df.set_index('Date') 

df.groupby(pd.Grouper(freq='1MS'))["Quantity"].count() 

    Date 
2013-01-01 1 
2013-02-01 0 
2013-03-01 1 
2013-04-01 0 
2013-05-01 1 
2013-06-01 0 
2013-07-01 0 
2013-08-01 1 
2013-09-01 1 
2013-10-01 0 
2013-11-01 1 

df.groupby(pd.Grouper(freq='2MS'))["Quantity"].count() 

    Date 
2013-01-01 1 
2013-03-01 1 
2013-05-01 1 
2013-07-01 1 
2013-09-01 1 
2013-11-01 1 

내가 찾던 것은 Grouper or TimeGrouper를 사용하여 인덱스 일로부터 "2MS"입니다. 위의 내용은 인덱스의 첫 번째 값 또는 2012 년 1 월 1 일부터 "2MS"을 반환합니다. 어떻게 2

타겟팅에 대한 '8/1/2013'에서 2MS을받을 수 있나요 :

 Date 
2013-01-01 1 
2013-03-01 1 
2013-05-01 1 
2013-08-01 2 
2013-09-01 1 
2013-11-01 1 

참고 : 내가 GROUPBY을 할 노력하고있어하는 것은 인덱스 값을 기반으로

..

- 1 GROUPBY 슬라이스를 시작할 것 1/1에서. 두 번째 슬라이스는 3/1에서 시작하고 세 번째 슬라이스는 5/1에서 시작합니다. 종료 기간은 2MS입니다. 이제 Grouper를 사용하여 첫 번째 날짜부터 슬라이스를 시작하고 두 달 간격으로 계속합니다. 네 번째 간격은 8/1 끝 10/2에서 시작해야합니다. 지금 당장 7/1에서 8/2가 시작됩니다.

+0

이 후 있습니까 = 'Date', freq = '2MS'), 'Buyer']). sum()'? 당신이 무엇을 성취하기를 원하는지는 정말로 분명하지 않습니다. – MaxU

+0

미안하지만 여전히 나에게 분명하지 않습니다. 다른 사람들이 그것을 이해하고 적절한 답을 줄 수 있기를 바랍니다. – MaxU

+0

다시 시도하십시오 ... Ist groupby (gb) 기간 시작 1/1 끝 3/1, 두 번째 gb 시작 2/1 끝 4/1 세 번째 gb 시작 3/1 끝 5/1, 4 번째 시작 8/2 끝 10/2 5 번째 시작 11/2 끝 1/2 내년. 모든 2M ... 그루퍼를 사용하면 첫 번째 값에서 슬라이스 카운트를 시작하고 2M 슬라이스에서 계속됩니다. 그루퍼가 슬라이스 창에서 첫 번째 이후 모든 값을 무시하기 때문에 적절한 슬라이스 시간 창을 얻을 수 없습니다. 타임 스탬프 인 인덱스 값을 기반으로 생각하는 2M 창. – Merlin

답변

0

pandas은 롤링 윈도우를 뒤로 만들고 싶습니다. 따라서 아이디어는 시리즈의 순서를 바꾸고 롤링 윈도우를 가져온 다음 순서를 되돌리는 것입니다.

당신이 이미 가지고 무엇을 :

from datetime import datetime 

import pandas as pd 

df = pd.DataFrame({'Buyer': 'Carl Mark Carl Joe Joe Carl'.split(), 
        'Quantity': [1, 3, 5, 8, 9, 3], 
        'Date' : [datetime(2013, 1, 1, 13, 0), 
          datetime(2013, 3, 1, 13, 5), 
          datetime(2013, 5, 1, 20, 0), 
          datetime(2013, 8, 2, 10, 0), 
          datetime(2013, 9, 2, 12, 0),          
          datetime(2013, 11, 2, 14, 0)]}) 
df = df.set_index('Date') 
print(df) 

#      Buyer Quantity 
# Date        
# 2013-01-01 13:00:00 Carl   1 
# 2013-03-01 13:05:00 Mark   3 
# 2013-05-01 20:00:00 Carl   5 
# 2013-08-02 10:00:00 Joe   8 
# 2013-09-02 12:00:00 Joe   9 
# 2013-11-02 14:00:00 Carl   3 

g1 = df.resample('MS')["Quantity"].count() 
print(g1) 

# Date 
# 2013-01-01 1 
# 2013-02-01 0 
# 2013-03-01 1 
# 2013-04-01 0 
# 2013-05-01 1 
# 2013-06-01 0 
# 2013-07-01 0 
# 2013-08-01 1 
# 2013-09-01 1 
# 2013-10-01 0 
# 2013-11-01 1 
# Freq: MS, Name: Quantity, dtype: int64 

을 그리고 이것은 결승선에 도착하는 방법입니다`df.groupby ([pd.Grouper (키 :

g2 = g1.sort_index(ascending=False).rolling(2, 0).sum().sort_index() 
print(g2) 

# Date 
# 2013-01-01 1.0 
# 2013-02-01 1.0 
# 2013-03-01 1.0 
# 2013-04-01 1.0 
# 2013-05-01 1.0 
# 2013-06-01 0.0 
# 2013-07-01 1.0 
# 2013-08-01 2.0 
# 2013-09-01 1.0 
# 2013-10-01 1.0 
# 2013-11-01 1.0 
# Freq: MS, Name: Quantity, dtype: float64 

print(g2[g1 != 0].astype(int)) 

# Date 
# 2013-01-01 1 
# 2013-03-01 1 
# 2013-05-01 1 
# 2013-08-01 2 
# 2013-09-01 1 
# 2013-11-01 1 
# Name: Quantity, dtype: int64 
+0

죄송하지만 Grouper를 사용하여이 작업을 수행하고 싶습니다. – Merlin

+0

나는 당신이 그루퍼로 할 수 있다고 생각하지 않습니다. 근본적으로 groupby 연산은 행을 그룹으로 매핑하여 작동합니다. 특히 행이 두 개의 다른 그룹에 속할 수는 없습니다 ('2013-09-01' 행의 경우와 동일). –

관련 문제