2016-06-16 16 views
5

나는 DataFrame는 시계열을 포함하는이 :GROUPBY와 TimeGrouper '뒤로'

rng = pd.date_range('2016-06-01', periods=24*7, freq='H') 
ones = pd.Series([1]*24*7, rng) 
rdf = pd.DataFrame({'a': ones}) 

마지막 항목은 2016-06-07 23:00:00입니다. 지금은 기본적과 같이,이에 의해 그룹에 이일 말하고자 :

  a 
2016-06-01 48 
2016-06-03 48 
2016-06-05 48 
2016-06-07 24 
그러나

rdf.groupby(pd.TimeGrouper('2D')).sum() 

, 그래서 뒤로 내 마지막 데이터에서 시작점 대신이 결과를 얻는 그룹화 할 '3D'에 의해 그룹화 할 때

  a 
2016-06-01 24 
2016-06-03 48 
2016-06-05 48 
2016-06-07 48 

과 :

나는 차라리이 기대

  a 
2016-06-01 24 
2016-06-04 72 
2016-06-07 72 

예상 결과 '4D'에 의해 그룹화 수 있습니다 :

  a 
2016-06-03 72 
2016-06-07 96 

나는 closed의 모든 조합 label 등 내가 생각할 수있는 이것을 얻을 수 없습니다입니다.

어떻게하면됩니까? 문제는 이제 일주일에 의해 그룹화에 초점을 맞추고 있기 때문에

답변

0

나는 주로 일주 일명, 내가 원하는 쓰레기통에 와서 지금은이 방법을 사용하고 7 일에 의해 그룹에 원하기 때문에 :

from pandas.tseries.offsets import Week 

# Let's not make full weeks 
hours = 24*6*4 
rng = pd.date_range('2016-06-01', periods=hours, freq='H') 

# Set week start to whatever the last weekday of the range is 
print("Last day is %s" % rng[-1]) 
freq = Week(weekday=rng[-1].weekday()) 

ones = pd.Series([1]*hours, rng) 
rdf = pd.DataFrame({'a': ones}) 
rdf.groupby(pd.TimeGrouper(freq=freq, closed='right', label='right')).sum() 

이 나에게

2016-06-25 96 
2016-07-02 168 
2016-07-09 168 
+0

이것은'''DateOffset'''로 더 일반적으로 할 수 있습니다. – TomTom101

0

, 당신은 간단하게 할 수 있습니다

rdf.resample('W-{}'.format(rdf.index[-1].strftime('%a')), closed='right', label='right').sum() 

당신은이 일을 얻을 수 loffset을 사용할 수 있습니다 - 적어도 (.resample()를 사용하여) 대부분의 기간 :

for i in range(2, 7): 
    print(i) 
    print(rdf.resample('{}D'.format(i), closed='right', loffset='{}D'.format(i)).sum()) 

2 
      a 
2016-06-01 24 
2016-06-03 48 
2016-06-05 48 
2016-06-07 48 
3 
      a 
2016-06-01 24 
2016-06-04 72 
2016-06-07 72 
4 
      a 
2016-06-01 24 
2016-06-05 96 
2016-06-09 48 
5 
       a 
2016-06-01 24 
2016-06-06 120 
2016-06-11 24 
6 
       a 
2016-06-01 24 
2016-06-07 144 

TimeGrouper없이 올바른 값을 계산하는 맞춤 그룹을 만들 수도 있습니다.

days = rdf.index.to_series().dt.day.unique()[::-1] 
for n in range(2, 7): 
    chunks = [days[i:i + n] for i in range(0, len(days), n)][::-1] 
    grp = pd.Series({k: v for d in [zip(chunk, [idx] * len(chunk)) for idx, chunk in enumerate(chunks)] for k, v in d}) 
    rdf.groupby(rdf.index.to_series().dt.day.map(grp))['a'].sum() 

2 
groups 
0 24 
1 48 
2 48 
3 48 
Name: a, dtype: int64 

3 
groups 
0 24 
1 72 
2 72 
Name: a, dtype: int64 

4 
groups 
0 72 
1 96 
Name: a, dtype: int64 

5 
groups 
0  48 
1 120 
Name: a, dtype: int64 

6 
groups 
0  24 
1 144 
Name: a, dtype: int64 
,
+0

의 원하는 출력을 제공합니다 감사! 마지막 빈이 내 가장 중요한 빈이기 때문에, 나는 이것을 매우 신뢰할 수 있어야합니다. 이상하게도, 손쉬운 손쉬운 해결책이없는 것 같습니다. – TomTom101

+0

신뢰할 수있는 방법으로 그룹 값을 계산할 수있는 솔루션은 업데이트되었지만 TimeGrouper는 사용하지 않았습니다. – Stefan

+0

받아 들여질 가치가 있습니다;) 감사합니다! – TomTom101

관련 문제