2016-06-28 3 views
2
data = {'dates': ['2010-01-29', '2011-06-14', '2012-01-18'], 'values': [4, 3, 8]} 
df = pd.DataFrame(data) 
df.set_index('dates') 
df.index = df.index.astype('datetime64[ns]') 

Имея блок данных, где индекс является датой, как я могу добавить новый столбец с пометкой «Месяц», который является суммой всех значений за этот месяц, но не " войти в будущее », как в том, что он добавляет только дни до его даты.Сумма значений с того же месяца

Это будет выглядеть столбец.

'Month': [4, 3, 12] 
+0

Те значения, соответствующие его г ay, 4 для '2010-01-29' и 8 для '2012-01-18' – user6162407

ответ

2

apply ваш друг здесь

def sum_from_months_prior(row, df): 
    '''returns sum of values in row month, 
    from all dates in df prior to row date''' 

    month = pd.to_datetime(row).month 

    all_dates_prior = df[df.index <= row] 
    same_month = all_dates_prior[all_dates_prior.index.month == month] 

    return same_month["values"].sum() 

data = {'dates': ['2010-01-29', '2011-06-14', '2012-01-18'], 'values': [4, 3, 8]} 
df = pd.DataFrame(data) 
df.set_index('dates', inplace = True) 
df.index = pd.to_datetime(df.index) 
df["dates"] = df.index 
df.sort_index(inplace = True) 

df["Month"] = df["dates"].apply(lambda row: sum_from_months_prior (row, df)) 
df.drop("dates", axis = 1, inplace = True) 

желательно ДФ:

  values Month 
dates 
2010-01-29  4  4 
2011-06-14  3  3 
2012-01-18  8  12 
0

Существует несколько способов сделать это. Первым было бы пересдать ежемесячно, используя df.resample(...).sum().

Вы также можете создать столбец месяца из индекса, используя df['month'] = df.index.month, а затем выполнить операцию groupby, df.groupby('month').sum() - какой метод лучше всего зависит от того, что вы хотите делать с данными.

4

Вы можете использовать панд TimeGrouper

df.groupby(pd.TimeGrouper('M')).sum() 
+0

Забыл о 'TimeGrouper', это способ сделать это. – Jeff