在 pandas df 中查找 timedelta 对象的均值和标准差
Posted
技术标签:
【中文标题】在 pandas df 中查找 timedelta 对象的均值和标准差【英文标题】:Finding the mean and standard deviation of a timedelta object in pandas df 【发布时间】:2017-11-20 20:13:12 【问题描述】:我想从dataframe
的银行计算timedelta
的mean
和standard 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
属性。
【参考方案1】:
您需要将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()
【讨论】:
谢谢,这很有魅力——(我使用了第一个解决方案)! 你能说出为什么第二种解决方案不太准确吗?【参考方案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 可以以更快的运行时间无缝地为您完成。使用你的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))
【讨论】:
【参考方案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]')
)
【讨论】:
以上是关于在 pandas df 中查找 timedelta 对象的均值和标准差的主要内容,如果未能解决你的问题,请参考以下文章
如何将 timedelta 与 pandas df.query() 一起使用?
如何将 timedelta 转换为 pandas 中的时间?