Панды - сумма первых X часов указателя даты и времени

1

У меня есть dataframe с индексом datetime и 100 столбцами.

Я хочу иметь новую фреймворк с тем же индексом и столбцами datetime, но значения будут содержать сумму первых 10 часов каждого дня.

Поэтому, если бы у меня был исходный dataframe:

                      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

Я решил, что сначала буду группировать по дате и выполнить сумму, а затем объединить результаты на основе даты. Есть ли лучший/быстрый способ сделать это?

Благодарю.

EDIT: Я работал над этим ответом, тем временем:

    df= df.between_time('0:00','9:00').groupby(pd.Grouper(freq='D')).sum()
    df= df.resample('1H').ffill() 
  • 0
    Пожалуйста, включите ваш код. Поскольку это зависит от вашей реализации, никто не знает, будет ли их код лучше / быстрее вашего.
  • 0
    У меня нет в данный момент. То, что я описал в последнем предложении, было просто идеей о том, как я могу это сделать.
Теги:
pandas
group-by

1 ответ

2
Лучший ответ

Вам нужно groupby df.index.date и использовать transfrom с лямбда - функцией, чтобы найти сумму первых 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
  • 0
    Красиво, спасибо! Я нашел другой ответ (см. Редактировать), который работает в то же время, но ваш лучше.
  • 0
    @ VincentL Добро пожаловать!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню