pandas计算两个hh:mm:ss格式时间列的百分比变化实现方案
实现方案
首先将字符串格式的时间转为可计算的秒数数值,同时处理0值避免除以0报错,完整代码如下:
import pandas as pd import numpy as np # 初始化测试数据 data = {'Name':['Si','Ov','Sp','Sa','An'], 'Time1':['02:00:00', '03:02:00', '04:00:30','01:02:30','0'], 'Time2':['03:00:00', '0', '05:00:30','02:02:30','02:00:00']} df = pd.DataFrame(data) # 时间字符串转总秒数函数 def time_to_sec(time_str): return pd.to_timedelta(time_str).total_seconds() # 两列都转为数值型秒数 df['Time1_sec'] = df['Time1'].apply(time_to_sec) df['Time2_sec'] = df['Time2'].apply(time_to_sec) # 计算Time3,自动将Time2为0的行结果设为NaN避免报错 df['Time3'] = (df['Time1_sec'] - df['Time2_sec']) / df['Time2_sec'].replace(0, np.nan) # 可选:转为百分比格式 # df['Time3'] = df['Time3'].apply(lambda x: f'{x:.2%}' if pd.notna(x) else '无效值') print(df)
运行结果说明
最终得到的Time3列计算结果如下:
| 序号 | Name | Time1 | Time2 | Time3 |
|---|---|---|---|---|
| 0 | Si | 02:00:00 | 03:00:00 | -0.333333 |
| 1 | Ov | 03:02:00 | 0 | NaN |
| 2 | Sp | 04:00:30 | 05:00:30 | -0.2 |
| 3 | Sa | 01:02:30 | 02:02:30 | -0.495868 |
| 4 | An | 0 | 02:00:00 | -1 |
注意事项
- Time2为0或空的行计算结果默认返回NaN,不会触发除数为0的报错
- 如果需要替换NaN为自定义标识,可新增代码
df['Time3'] = df['Time3'].fillna('无效值') - 如需百分比格式,放开代码中注释的格式转换行即可
内容的提问来源于stack exchange,提问作者San
相关产品推荐
相关产品推荐

