在 pandas df 中查找 timedelta 对象的均值和标准差

Finding the mean and standard deviation of a timedelta object in pandas df

我想从 dataframe 中计算银行 timedeltameanstandard deviation,两列如下所示。当我 运行 代码(也如下所示)时,出现以下错误:

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

我的数据框:

   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

我的代码:

means = dropped.groupby('bank').mean()
std = dropped.groupby('bank').std()

您需要将 timedelta 转换为某个数值,例如int64 by values 什么是最准确的,因为转换为 ns 就是 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'])

另一个解决方案是通过 total_seconds 将值转换为 seconds,但不太准确:

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

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

不需要来回转换timedelta。 Numpy 和 pandas 可以用更快的 运行 时间无缝地为您完成。使用你的 dropped DataFrame:

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))

Pandasmean()等聚合方式支持numeric_only=False参数。

dropped.groupby('bank').mean(numeric_only=False)

在此处找到:Aggregations for Timedelta values in the Python DataFrame

我建议将 numeric_only=False 参数传递给 Alexander Usikov 提到的 mean - 这适用于 pandas 版本 0.20+。

如果您使用的是旧版本,则可以执行以下操作:

import pandas pd

df = pd.DataFrame({
    'td': pd.Series([pd.Timedelta(days=i) for i in range(5)]),
    'group': ['a', 'a', 'a', 'b', 'b']
})

(
    df
    .astype({'td': int})         # convert timedelta to integer (nanoseconds)
    .groupby('group')
    .mean()
    .astype({'td': 'timedelta64[ns]'})
)