Python 同一月份的值之和

Python 同一月份的值之和,python,pandas,Python,Pandas,如果有一个数据框,其中索引是日期,我将如何添加一个新的列caled'Month',该列是该月所有值的总和,但不会“输入未来”,因为它只在日期之前加上天 这就是专栏的样子 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('datetime6

如果有一个数据框,其中索引是日期,我将如何添加一个新的列caled'Month',该列是该月所有值的总和,但不会“输入未来”,因为它只在日期之前加上天

这就是专栏的样子

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]')

有几种方法可以做到这一点。第一种方法是使用
df.resample(…).sum()
对每月进行重新采样


您还可以使用
df['month']=df.index.month
,从索引中创建一个月列,然后执行分组操作,
df.groupby('month').sum()
-哪种方法最好取决于您想对数据做什么。

您可以使用pandas
TimeGrouper

'Month': [4, 3, 12] 

apply
你的朋友在这里吗

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

这些是对应于它的日期的值,4代表“2010-01-29”,8代表“2012-01-18”,忘记了
TimeGrouper
,这就是方法。
pd.TimeGrouper()
在pandas
v0.21.0
中被正式弃用,取而代之的是
pd.Grouper()
。看见
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