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

如何在仅保留时间无日期的前提下计算Pandas中时间差?

解决Pandas中超24小时时间的站间间隔计算问题

问题背景

给定如下Pandas DataFrame,包含公交路线、站点及到达/出发时间(部分时间超过24小时,如27:32:00):

import pandas as pd

stoptimes_df = pd.DataFrame({
    'trip_id': ['1', '1', '1', '2', '2', '2'], 
    'arrival_time': ["12:10:00", "12:20:00", "12:30:00", "27:32:00", "27:39:00", "27:45:00"],
    'departure_time': ["12:10:00", "12:20:00", "12:30:00", "27:32:00", "27:39:00", "27:45:00"],
    'stop_id': ['de:08437:48835:0:2', 'de:08426:6306', 'de:08426:6307', 'de:08116:6703', 'de:08116:3821', 'de:08415:28256:0:1']})

需求

  • 新增一列存储同一路线(trip_id)中,下一站到达时间与当前站出发时间的时间差(单位为分钟或秒)
  • 必须保留arrival_time和departure_time列的纯时间显示,不能附带日期

遇到的问题

尝试将时间转为datetime.time类型后,用groupby结合diff()计算差值时,抛出错误:

TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'

转为datetime.datetime类型会自动添加默认日期,不符合显示要求;直接使用timedelta处理超24小时的时间也存在兼容问题。


解决方案

核心思路:将时间字符串转换为总秒数(数值类型)进行差值计算,同时保留原时间列的文本格式不变。

1. 编写时间转秒数的函数

拆分时间字符串的时、分、秒,计算总秒数,兼容超24小时的时间:

def time_to_seconds(time_str):
    h, m, s = map(int, time_str.split(':'))
    return h * 3600 + m * 60 + s

2. 生成秒数列并计算站间间隔

对到达/出发时间生成对应的秒数列,按路线分组后计算间隔:

# 生成临时秒数列
stoptimes_df['arrival_sec'] = stoptimes_df['arrival_time'].apply(time_to_seconds)
stoptimes_df['departure_sec'] = stoptimes_df['departure_time'].apply(time_to_seconds)

# 计算站间间隔(秒):下一站到达秒数 - 当前站出发秒数
stoptimes_df['interval_sec'] = stoptimes_df.groupby('trip_id')['arrival_sec'].shift(-1) - stoptimes_df['departure_sec']

# 可选:转成分钟单位
stoptimes_df['interval_min'] = stoptimes_df['interval_sec'] / 60

3. 清理临时列(可选)

如果不需要保留arrival_sec和departure_sec临时列,可直接删除:

stoptimes_df.drop(['arrival_sec', 'departure_sec'], axis=1, inplace=True)

最终效果

处理后的DataFrame中,arrival_time和departure_time仍保持原纯时间格式,新增的interval_sec或interval_min列准确显示了同路线内的站间间隔时间。例如trip_id=2的站间间隔分别为7分钟、6分钟,完全符合预期。

内容的提问来源于stack exchange,提问作者deputy-chief-hardy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:33:37