如何用Pandas计算公交预计与实际停靠时间的秒级差值并正确显示正负数值
解决Pandas时间差显示异常及获取正负秒数格式的问题
我来帮你搞定这个问题!先给你拆解下为什么会出现你看到的奇怪结果:
- Pandas的
Timedelta类型处理负时间差时,会用负数天数+正数时分秒的形式来表示,比如-1 days +23:59:16其实等价于-44秒(因为24小时总秒数86400减去86356,正好是44,所以实际差值是-44秒)。 - 而
.dt.seconds方法只会提取Timedelta里时间部分的秒数,完全不考虑天数的正负,所以第二行得到的86356只是23:59:16对应的秒数,并不是你要的真实时间差。
要得到你想要的+9和-44格式,核心是用**dt.total_seconds()方法,它会返回时间差的总秒数(带正负符号)**,再配合简单的字符串格式化就能实现需求。
完整解决方案代码
import pandas as pd # 创建原始数据 d = { 'time_A': ['2022-08-30 06:21:00', '2022-08-30 16:41:00'], 'time_B': ['2022-08-30 06:21:09', '2022-08-30 16:40:16'], } # 构建DataFrame并转换时间类型 my_df = pd.DataFrame(d) my_df['time_A'] = pd.to_datetime(my_df['time_A']) my_df['time_B'] = pd.to_datetime(my_df['time_B']) # 计算带正负的总秒数,并格式化为目标字符串 my_df['difference'] = (my_df['time_B'] - my_df['time_A']).dt.total_seconds().apply( lambda x: f"+{int(x)}" if x > 0 else f"{int(x)}" )
最终执行结果
| time_A | time_B | difference | |
|---|---|---|---|
| 0 | 2022-08-30 06:21:00 | 2022-08-30 06:21:09 | +9 |
| 1 | 2022-08-30 16:41:00 | 2022-08-30 16:40:16 | -44 |
关键细节说明
dt.total_seconds():直接返回时间差的总秒数,正数代表time_B晚于time_A,负数代表time_B早于time_A,完美匹配你的业务逻辑。apply(lambda x: ...):把浮点型的秒数转为整数后,根据正负值添加+号(正数)或保留负号(负数),精准实现你要的显示格式。
内容的提问来源于stack exchange,提问作者Vincent Tep
相关产品推荐
相关产品推荐

