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

时间:2017-06-18 15:24:20

标签: python pandas datetime mean timedelta

我想从[{1}}按行计算meanstandard deviation的{​​{1}}和timedelta,其中两列如下所示。当我运行代码(也显示如下)时,我得到以下错误:

dataframe

我的数据框:

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

4 个答案:

答案 0 :(得分:12)

您需要将timedelta转换为某个数字值,例如int64 values最准确的是什么,因为转换为nstimedelta的数字表示形式:

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

另一种解决方案是将值seconds转换为dropped['new'] = dropped['diff'].dt.total_seconds() means = dropped.groupby('bank').mean() ,但这不太准确:

{{1}}

答案 1 :(得分:4)

无需来回转换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))

答案 2 :(得分:3)

熊猫mean()和其他聚合方法支持numeric_only=False参数。

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

在这里找到:Aggregations for Timedelta values in the Python DataFrame

答案 3 :(得分:0)

我建议按照亚历山大·乌西科夫(Alexander Usikov)的说法,将numeric_only=False参数传递给mean-这适用于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]'})
)