2015-04-02 3 views
1

я в настоящее время группировка моих данных по времени с помощьюПанды TimeGrouper: Границы для группировки

df.groupby(pd.TimeGrouper('AS')) 

, который дает мне ежегодные группы. Тем не менее, я бы хотел, чтобы эти группы начинались в марте, а точнее xxxx-03-01 на каждый год.

Одним из способов обеспечения соблюдения этого является обеспечение того, чтобы моя первая точка данных была в начале марта или моя последняя точка данных заканчивалась 28 февраля и использовала closed='right'. На данный момент для меня это невозможно. Как еще я мог собираться ежегодно с марта по март?

+0

Возможно, PeriodRange и некоторые нарезки вместо этого? http://pandas.pydata.org/pandas-docs/dev/timeseries.html#periodindex-and-period-range – cphlewis

ответ

0

Вдохновленный @cphlewis, вот мой метод группеГо, что группы ежегодно, но начинается в данном месяце:

rng = pd.date_range('1/1/2011', periods=25, freq='M') 
ts = pd.DataFrame(np.random.randn(len(rng)), index=rng, columns=['ts']) 

def groupByYearMonth(ts, month): 
    starts = ts[ts.index.month==month].index # Fix if multiple entries per month. 

    if starts[0] > ts.index[0]: 
     ts.loc[ts.index < starts[0], 'group'] = starts[0].year - 1 
    for start in starts: 
     end = '%d-%d'%(start.year+1, start.month-1) 
     ts.loc[start:end, 'group'] = start.year 
    return ts.groupby('group') 

groupBy = groupByYearMonth(ts, 3) 
print groupBy.mean(), groupBy.size() 
      ts 
group   
2010 0.638609 
2011 -0.124718 
2012 0.385539 group 
2010  2 
2011  12 
2012  11 
dtype: int64 
1

безвкусный, но я не вижу, что GroupBy имеет такой аргумент построен в:

import pandas as pd 
from numpy.random import randn 

rng = pd.date_range('1/1/2011', periods=25, freq='M') 
ts = pd.Series(randn(len(rng)), index=rng) 

def truncYears(ts, month): 
    starts = ts[ts.index.month==month].index # Fix if multiple entries per month. 

    groups = {} 
    if starts[0] > ts.index[0]: 
     groups[ts.index[0]] = ts[ts.index < starts[0]] 
    for start in starts: 
     end = '%d-%d'%(start.year+1, start.month-1) 
     print(start, end) 
     groups[start] = ts[start:end] 

    return groups 

groups = truncYears(ts, 3) 
for k in groups: 
    print(groups[k]) 

результата (ключи Dict записные не отсортирован, так лет не в порядке):

2011-01-31 -1.719806 
2011-02-28 -0.657064 
Freq: M, dtype: float64 
2012-03-31 1.200984 
2012-04-30 -0.496715 
2012-05-31 -0.998218 
2012-06-30 1.711504 
2012-07-31 0.304211 
2012-08-31 1.091810 
2012-09-30 -0.716785 
2012-10-31 -0.996493 
2012-11-30 -0.541812 
2012-12-31 1.027787 
2013-01-31 0.249775 
Freq: M, dtype: float64 
2011-03-31 -1.406736 
2011-04-30 0.245077 
2011-05-31 -0.010090 
2011-06-30 -1.459824 
2011-07-31 0.150871 
2011-08-31 -1.223533 
2011-09-30 0.859539 
2011-10-31 0.623674 
2011-11-30 -2.071204 
2011-12-31 0.254750 
2012-01-31 0.667076 
2012-02-29 0.076249 
Freq: M, dtype: float64 
+0

Я тоже ничего не мог найти, поэтому я построил свой последний метод на основе вашего подхода. – FooBar

Смежные вопросы