web-dev-qa-db-fra.com

Recherche de la moyenne et de l'écart type d'un objet timedelta dans les pandas df

Je voudrais calculer la mean et le standard deviation d'une timedelta par banque à partir d'une dataframe à deux colonnes comme ci-dessous. Lorsque je lance le code (également illustré ci-dessous), l'erreur ci-dessous apparaît:

pandas.core.base.DataError: No numeric types to aggregate

Mon cadre de données:

   bank                          diff
   Bank of Japan                 0 days 00:00:57.416000
   Reserve Bank of Australia     0 days 00:00:21.452000
   Reserve Bank of New Zealand  55 days 12:39:32.269000
   U.S. Federal Reserve          8 days 13:27:11.387000

Mon code:

means = dropped.groupby('bank').mean()
std = dropped.groupby('bank').std()
9
Graham Streich

Vous devez convertir timedelta en une valeur numérique, par exemple. int64 par values ce qui est le plus précis, car convertir en ns est ce qui est la représentation numérique de timedelta:

dropped['new'] = dropped['diff'].values.astype(np.int64)

means = dropped.groupby('bank').mean()
means['new'] = pd.to_timedelta(means['new'])

std = dropped.groupby('bank').std()
std['new'] = pd.to_timedelta(std['new'])

Une autre solution consiste à convertir les valeurs en seconds avec total_seconds , mais cela est moins précis:

dropped['new'] = dropped['diff'].dt.total_seconds()

means = dropped.groupby('bank').mean()
11
jezrael

Pas besoin de convertir timedelta avant et en arrière. Numpy et les pandas peuvent le faire de manière transparente avec un temps d'exécution plus rapide. En utilisant votre droppedDataFrame:

import numpy as np

grouped = dropped.groupby('bank')['diff']

mean = grouped.apply(lambda x: np.mean(x))
std = grouped.apply(lambda x: np.std(x))
3
Wesam