熊猫:如何对日期范围内的列值求和

时间:2018-07-21 11:01:53

标签: python pandas sum date-range

我试图在基于“ date”列的日期范围内对colA的值求和,并将此滚动值存储在新列“ sum_col”中 但是我得到的是所有行的总和(= 100),而不仅仅是日期范围内的行。

我不能使用滚动或分组方式,因为我的日期(在真实数据中)不是连续的(缺少几天)

艾米的主意该怎么做?谢谢。

# Create data frame
df = pd.DataFrame()

# Create datetimes and data
df['date'] = pd.date_range('1/1/2018', periods=100, freq='D')
df['colA']= 1
df['colB']= 2
df['colC']= 3


StartDate = df.date-  pd.to_timedelta(5, unit='D') 
EndDate= df.date

dfx=df
dfx['StartDate'] = StartDate
dfx['EndDate'] = EndDate

dfx['sum_col']=df[(df['date'] > StartDate) & (df['date'] <= EndDate)].sum()['colA']
dfx.head(50)

2 个答案:

答案 0 :(得分:2)

我不确定是否要分别为colA,colB,colC的总和分配3列,还是要对这三者求和的一列,但这是一个示例,您如何对colA的值求和:

dfx['colAsum'] = dfx.apply(lambda x: df.loc[(df.date >= x.StartDate) & 
                                            (df.date <= x.EndDate), 'colA'].sum(), axis=1)

例如(带有periods=10):

        date  colA  colB  colC  StartDate    EndDate  colAsum
0 2018-01-01     1     2     3 2017-12-27 2018-01-01        1
1 2018-01-02     1     2     3 2017-12-28 2018-01-02        2
2 2018-01-03     1     2     3 2017-12-29 2018-01-03        3
3 2018-01-04     1     2     3 2017-12-30 2018-01-04        4
4 2018-01-05     1     2     3 2017-12-31 2018-01-05        5
5 2018-01-06     1     2     3 2018-01-01 2018-01-06        6
6 2018-01-07     1     2     3 2018-01-02 2018-01-07        6
7 2018-01-08     1     2     3 2018-01-03 2018-01-08        6
8 2018-01-09     1     2     3 2018-01-04 2018-01-09        6
9 2018-01-10     1     2     3 2018-01-05 2018-01-10        6

答案 1 :(得分:0)

如果我的理解是正确的:

for i in range(df.shape[0]):

    dfx.loc[i,'sum_col']=df[(df['date'] > StartDate[i]) & (df['date'] <= EndDate[i])].sum()['colA']

例如,在(2018-01-01, 2018-01-06)范围内,总和为6

date    colA    colB    colC    StartDate   EndDate sum_col
0   2018-01-01  1   2   3   2017-12-27  2018-01-01  1.0
1   2018-01-02  1   2   3   2017-12-28  2018-01-02  2.0
2   2018-01-03  1   2   3   2017-12-29  2018-01-03  3.0
3   2018-01-04  1   2   3   2017-12-30  2018-01-04  4.0
4   2018-01-05  1   2   3   2017-12-31  2018-01-05  5.0
5   2018-01-06  1   2   3   2018-01-01  2018-01-06  5.0
6   2018-01-07  1   2   3   2018-01-02  2018-01-07  5.0 
7   2018-01-08  1   2   3   2018-01-03  2018-01-08  5.0
8   2018-01-09  1   2   3   2018-01-04  2018-01-09  5.0
9   2018-01-10  1   2   3   2018-01-05  2018-01-10  5.0
10  2018-01-11  1   2   3   2018-01-06  2018-01-11  5.0