如何在仅保留时间无日期的前提下计算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
相关产品推荐
相关产品推荐

