You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中计算timedelta占比时处理除零错误的方法

解决Pandas Timedelta计算比例时的除零问题

针对你遇到的timedelta类型列计算比例时触发除零错误的问题,推荐以下几种Pandas/numpy原生的高性能解决方案:

方法一:用numpy.where做条件判断

先计算主动时间与被动时间的总和,通过条件判断总和是否为0,为0时返回NaN,否则计算比例:

import numpy as np
import pandas as pd

# 构造示例DataFrame
dataframe = pd.DataFrame(
    {
        'proactive_time': [pd.Timedelta(seconds=30), pd.Timedelta(0)],
        'passive_time': [pd.Timedelta(seconds=20), pd.Timedelta(0)]
    },
    index=['foo', 'bar']
)

total_time = dataframe['proactive_time'] + dataframe['passive_time']
dataframe['proactive_ratio'] = np.where(
    total_time == pd.Timedelta(0),
    np.nan,
    dataframe['proactive_time'] / total_time
)

该方法采用向量化运算,性能远优于循环或apply,直接处理timedelta类型无需转换。

方法二:转换为数值型后处理

将timedelta转换为总秒数(或其他时间单位),计算比例后替换除零产生的inf值为NaN:

# 提取各列的总秒数
proactive_sec = dataframe['proactive_time'].dt.total_seconds()
passive_sec = dataframe['passive_time'].dt.total_seconds()
total_sec = proactive_sec + passive_sec

# 计算比例并替换异常值
dataframe['proactive_ratio'] = proactive_sec / total_sec
dataframe['proactive_ratio'] = dataframe['proactive_ratio'].replace([np.inf, -np.inf], np.nan)

这种方法利用数值运算的特性,将除零产生的无穷大值统一替换为NaN,同样是向量化操作,性能优异。

补充:关于apply的说明

你提到apply难以访问多列,其实可以通过指定axis=1实现,但apply本质是逐行遍历,性能远不如上述向量化方法,仅作参考:

dataframe['proactive_ratio'] = dataframe.apply(
    lambda row: row['proactive_time'] / (row['proactive_time'] + row['passive_time']) 
    if (row['proactive_time'] + row['passive_time']) != pd.Timedelta(0) 
    else np.nan,
    axis=1
)

内容的提问来源于stack exchange,提问作者PlankTon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:45:16