首页 > 解决方案 > Pandas - 日期时间索引前 X 小时的总和

问题描述

我有一个带有日期时间索引和 100 列的数据框。

我想要一个具有相同日期时间索引和列的新数据框,但这些值将包含每天前 10 小时的总和。

因此,如果我有这样的原始数据框:

                      A   B    C
---------------------------------
2018-01-01 00:00:00   2   5   -10
2018-01-01 01:00:00   6   5   7
2018-01-01 02:00:00   7   5   9
2018-01-01 03:00:00   9   5   6
2018-01-01 04:00:00   10  5   2
2018-01-01 05:00:00   7   5   -1
2018-01-01 06:00:00   1   5   -1
2018-01-01 07:00:00   -4  5   10
2018-01-01 08:00:00   9   5   10
2018-01-01 09:00:00   21  5   -10
2018-01-01 10:00:00   2   5   -1
2018-01-01 11:00:00   8   5   -1
2018-01-01 12:00:00   8   5   10
2018-01-01 13:00:00   8   5   9
2018-01-01 14:00:00   7   5   -10
2018-01-01 15:00:00   7   5   5
2018-01-01 16:00:00   7   5   -10
2018-01-01 17:00:00   4   5   7
2018-01-01 18:00:00   5   5   8
2018-01-01 19:00:00   2   5   8
2018-01-01 20:00:00   2   5   4
2018-01-01 21:00:00   8   5   3
2018-01-01 22:00:00   1   5   3
2018-01-01 23:00:00   1   5   1
2018-01-02 00:00:00   2   5   2
2018-01-02 01:00:00   3   5   8
2018-01-02 02:00:00   4   5   6
2018-01-02 03:00:00   5   5   6
2018-01-02 04:00:00   1   5   7
2018-01-02 05:00:00   7   5   7
2018-01-02 06:00:00   5   5   1
2018-01-02 07:00:00   2   5   2
2018-01-02 08:00:00   4   5   3
2018-01-02 09:00:00   6   5   4
2018-01-02 10:00:00   9   5   4
2018-01-02 11:00:00   11  5   5
2018-01-02 12:00:00   2   5   8
2018-01-02 13:00:00   2   5   0
2018-01-02 14:00:00   4   5   5
2018-01-02 15:00:00   5   5   4
2018-01-02 16:00:00   7   5   4
2018-01-02 17:00:00   -1  5   7
2018-01-02 18:00:00   1   5   7
2018-01-02 19:00:00   1   5   7
2018-01-02 20:00:00   5   5   7
2018-01-02 21:00:00   2   5   7
2018-01-02 22:00:00   2   5   7
2018-01-02 23:00:00   8   5   7

因此,对于日期为 2018-01-01 的所有行:

The value for column A would be 68 (2+6+7+9+10+7+1-4+9+21)
The value for column B would be 50 (5+5+5+5+5+5+5+5+5+5)
The value for column C would be 22 (-10+7+9+6+2-1-1+10+10-10)

因此,对于日期为 2018-01-02 的所有行:

The value for column A would be 39 (2+3+4+5+1+7+5+2+4+6)
The value for column B would be 50 (5+5+5+5+5+5+5+5+5+5)
The value for column C would be 46 (2+8+6+6+7+7+1+2+3+4)

结果将是:

                      A   B   C
---------------------------------
2018-01-01 00:00:00   68  50  22
2018-01-01 01:00:00   68  50  22
2018-01-01 02:00:00   68  50  22
2018-01-01 03:00:00   68  50  22
2018-01-01 04:00:00   68  50  22
2018-01-01 05:00:00   68  50  22
2018-01-01 06:00:00   68  50  22
2018-01-01 07:00:00   68  50  22
2018-01-01 08:00:00   68  50  22
2018-01-01 09:00:00   68  50  22
2018-01-01 10:00:00   68  50  22
2018-01-01 11:00:00   68  50  22
2018-01-01 12:00:00   68  50  22
2018-01-01 13:00:00   68  50  22
2018-01-01 14:00:00   68  50  22
2018-01-01 15:00:00   68  50  22
2018-01-01 16:00:00   68  50  22
2018-01-01 17:00:00   68  50  22
2018-01-01 18:00:00   68  50  22
2018-01-01 19:00:00   68  50  22
2018-01-01 20:00:00   68  50  22
2018-01-01 21:00:00   68  50  22
2018-01-01 22:00:00   68  50  22
2018-01-01 23:00:00   68  50  22
2018-01-02 00:00:00   39  50  46
2018-01-02 01:00:00   39  50  46
2018-01-02 02:00:00   39  50  46
2018-01-02 03:00:00   39  50  46
2018-01-02 04:00:00   39  50  46
2018-01-02 05:00:00   39  50  46
2018-01-02 06:00:00   39  50  46
2018-01-02 07:00:00   39  50  46
2018-01-02 08:00:00   39  50  46
2018-01-02 09:00:00   39  50  46
2018-01-02 10:00:00   39  50  46
2018-01-02 11:00:00   39  50  46
2018-01-02 12:00:00   39  50  46
2018-01-02 13:00:00   39  50  46
2018-01-02 14:00:00   39  50  46
2018-01-02 15:00:00   39  50  46
2018-01-02 16:00:00   39  50  46
2018-01-02 17:00:00   39  50  46
2018-01-02 18:00:00   39  50  46
2018-01-02 19:00:00   39  50  46
2018-01-02 20:00:00   39  50  46
2018-01-02 21:00:00   39  50  46
2018-01-02 22:00:00   39  50  46
2018-01-02 23:00:00   39  50  46

我想我会先按日期分组并执行总和,然后根据日期合并结果。有没有更好/更快的方法来做到这一点?

谢谢。

编辑:我同时研究了这个答案:

    df= df.between_time('0:00','9:00').groupby(pd.Grouper(freq='D')).sum()
    df= df.resample('1H').ffill() 

标签: pythonpandasgroup-by

解决方案


您需要groupby df.index.date并使用transfromlambda 函数来查找前 10 个值的总和:

df.loc[:,['A','B','C']] = df.groupby(df.index.date).transform(lambda x: x[:10].sum()) 

或者,如果分组值和实列的序列相同

df.loc[:,:] = df.groupby(df.index.date).transform(lambda x: x[:10].sum())

print(df)
                      A   B   C
2018-01-01 00:00:00  68  50  22
2018-01-01 01:00:00  68  50  22
2018-01-01 02:00:00  68  50  22
2018-01-01 03:00:00  68  50  22
2018-01-01 04:00:00  68  50  22
2018-01-01 05:00:00  68  50  22
2018-01-01 06:00:00  68  50  22
2018-01-01 07:00:00  68  50  22
2018-01-01 08:00:00  68  50  22
2018-01-01 09:00:00  68  50  22
2018-01-01 10:00:00  68  50  22
2018-01-01 11:00:00  68  50  22
2018-01-01 12:00:00  68  50  22
2018-01-01 13:00:00  68  50  22
2018-01-01 14:00:00  68  50  22
2018-01-01 15:00:00  68  50  22
2018-01-01 16:00:00  68  50  22
2018-01-01 17:00:00  68  50  22
2018-01-01 18:00:00  68  50  22
2018-01-01 19:00:00  68  50  22
2018-01-01 20:00:00  68  50  22
2018-01-01 21:00:00  68  50  22
2018-01-01 22:00:00  68  50  22
2018-01-01 23:00:00  68  50  22
2018-01-02 00:00:00  39  50  46
2018-01-02 01:00:00  39  50  46
2018-01-02 02:00:00  39  50  46
2018-01-02 03:00:00  39  50  46
2018-01-02 04:00:00  39  50  46
2018-01-02 05:00:00  39  50  46
2018-01-02 06:00:00  39  50  46
2018-01-02 07:00:00  39  50  46
2018-01-02 08:00:00  39  50  46
2018-01-02 09:00:00  39  50  46
2018-01-02 10:00:00  39  50  46
2018-01-02 11:00:00  39  50  46
2018-01-02 12:00:00  39  50  46
2018-01-02 13:00:00  39  50  46
2018-01-02 14:00:00  39  50  46
2018-01-02 15:00:00  39  50  46
2018-01-02 16:00:00  39  50  46
2018-01-02 17:00:00  39  50  46
2018-01-02 18:00:00  39  50  46
2018-01-02 19:00:00  39  50  46
2018-01-02 20:00:00  39  50  46
2018-01-02 21:00:00  39  50  46
2018-01-02 22:00:00  39  50  46
2018-01-02 23:00:00  39  50  46

推荐阅读