рассчитать среднее время в группе, датафрейм панды - PullRequest
1 голос
/ 27 октября 2019

Поэтому мне нужно рассчитать среднее время на основе области:

      id  direction     area    when
 2   220      in         K1    2014-09-01 02:00
 3   220     out         -     2014-09-03 12:20
 6   826      in         K3     2014-11-11 10:00
 7   826     out         -     2014-12-09 10:15
 9   901      in         K1     2014-09-01 10:05
 10  901     out         -     2014-10-05 13:20
 11  901      in         K5     2014-09-01 15:00
 12  901     out         -     2014-11-01 23:00

Я хочу сгруппировать df по области, а затем проверить среднее время для каждой области.

Я попытался просто создать новый столбец и получить различия. Ничего не происходит ...

df['When']=pd.to_datetime(df['When'], format='%Y/%m/%d %H:%M')

for a in range(df.shape[0],-1,1): 
   df['Time_diff'][i+1] = datetime.datetime.min+ ( df['when][i+1]-df['when'][i])).time() 

1 Ответ

0 голосов
/ 27 октября 2019

Определите функцию, вычисляющую количество секунд между «входом» и «выходом» из группы из 2 строк, возвращая также код area :

def fn(grp):
    return pd.Series([grp.iloc[0, 2], int((grp.iloc[1, 3]
        - grp.iloc[0, 3]).total_seconds())], index=['area', 'secs'])

ТогдаИдея такова:

  • сгруппировать исходные строки в пары (2 последовательные строки для "in" и "out"),
  • применить вышеупомянутую функцию, вычисляя общее количество секунд для этого "периода",
  • сгруппируйте приведенный выше результат по area и вычислите mean .

Код для этого:

df.groupby(np.arange(len(df.index)) // 2).apply(fn).groupby('area').mean()

Для ваших данных результат:

         secs
area         
K1    1579650
K3    2420100
K5    5299200

Если вы хотите, вы можете преобразовать его, например, в Timedelta .

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