【问题标题】:Finding the mean and standard deviation of a timedelta object in pandas df在 pandas df 中查找 timedelta 对象的均值和标准差
【发布时间】:2017-11-20 20:13:12
【问题描述】:

我想从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 对象?如果您要进行聚合,请访问 .days.seconds 属性。

标签: python pandas datetime mean timedelta


【解决方案1】:

您需要将timedelta 转换为某个数值,例如int64 by 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'])

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

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

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

【讨论】:

  • 谢谢,这很有魅力——(我使用了第一个解决方案)!
  • 你能说出为什么第二种解决方案不太准确吗?
【解决方案2】:

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

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

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

【讨论】:

  • 这样更优雅,IMO 应该是公认的答案!
【解决方案3】:

无需来回转换timedelta。 Numpy 和 pandas 可以以更快的运行时间无缝地为您完成。使用你的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))

【讨论】:

    【解决方案4】:

    我建议将 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]'})
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-24
      • 2016-08-21
      • 2013-03-24
      • 1970-01-01
      • 2020-05-22
      • 2022-01-19
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多