Как может pandas dataframe с TimedeltaIndex сгруппировать по ближайшему целому дню? - PullRequest
2 голосов
/ 20 сентября 2019

У меня есть пандас DataFrame с индексом pd.TimeDeltas, некоторые из которых являются долями дней.Я хотел бы использовать df.groupby для группировки строк по целым дням (игнорируя доли дней), чтобы я мог вычислить среднее значение.

Вот пример того, что я хотел бы сделать:

import pandas as pd
import numpy as np

data = [[1,2,3], [2,3,4], [3,4,5], [1,2,3], [2,3,4], [3,4,5]]
idx = [pd.Timedelta('1.2 days'), pd.Timedelta('1.2 days'), pd.Timedelta('3.8 days'), pd.Timedelta('3.8 days'), pd.Timedelta('4.2 days'), pd.Timedelta('4.2 days')]
df = pd.DataFrame(data, columns=['a', 'b', 'c'])
df.index = idx

df
Out: 
    a   b   c
1 days 04:48:00     1   2   3
1 days 04:48:00     2   3   4
3 days 19:12:00     3   4   5
3 days 19:12:00     1   2   3
4 days 04:48:00     2   3   4
4 days 04:48:00     3   4   5

Строка ниже дает желаемый результат, однако создает дополнительные строки для каждого дня, поэтому есть строки, заполненные NaN, которые я впоследствии удаляю с помощью df.dropna().Есть ли лучший подход к этому?

df.groupby(pd.Grouper(freq='D')).aggregate(np.mean).dropna()

1 Ответ

3 голосов
/ 20 сентября 2019

Ваш подход в порядке, или вы можете просто сгруппировать по df.index.days, как показано ниже:

In [196]: df.groupby(df.index.days).mean()
Out[196]:
     a    b    c
1  1.5  2.5  3.5
3  2.0  3.0  4.0
4  2.5  3.5  4.5

Разница в этих двух методах заключается в том, где вещи сгруппированы на полях.В вашем случае что-то в 2 days, 02:00:00 будет сгруппировано с однодневными строками, так как pd.Grouper будет начинаться с первого примера, тогда как в моем, он получит отдельную строку, так как обрабатывает полночь как начало новой группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...