如何基于前后已知出发时间动态插补缺失的出发时间?
时间缺失值的线性插值解决方案
核心逻辑
针对出发时间中以0标记的缺失值,采用以下步骤插补:
- 定位每个缺失值区间的上一个有效时间和下一个有效时间
- 计算两个有效时间的总秒数差,区间内的间隔数为「缺失值数量 + 1」
- 将总时间差平均分配到每个间隔,依次计算并填充缺失位置的时间
代码实现(Python)
首先实现时间与秒数的转换工具函数,方便数值计算:
def time_to_sec(time_str): """将HH:MM:SS格式字符串转换为总秒数""" h, m, s = map(int, time_str.split(':')) return h * 3600 + m * 60 + s def sec_to_time(seconds): """将总秒数转换为HH:MM:SS格式字符串""" h = seconds // 3600 m = (seconds % 3600) // 60 s = seconds % 60 return f"{h:02d}:{m:02d}:{s:02d}"
然后实现动态插值的核心函数:
def interpolate_missing_times(times): """ 对包含缺失值(标记为"0")的时间列表进行线性插值 :param times: 时间字符串列表,缺失值用"0"表示 :return: 填充后的时间列表 """ processed = times.copy() n = len(processed) i = 0 while i < n: if processed[i] == "0": # 查找上一个有效时间的索引 prev_idx = i - 1 while prev_idx >= 0 and processed[prev_idx] == "0": prev_idx -= 1 if prev_idx < 0: i += 1 continue # 查找下一个有效时间的索引 next_idx = i + 1 while next_idx < n and processed[next_idx] == "0": next_idx += 1 if next_idx >= n: i += 1 continue # 计算时间差与步长 prev_sec = time_to_sec(processed[prev_idx]) next_sec = time_to_sec(processed[next_idx]) total_diff = next_sec - prev_sec interval_count = next_idx - prev_idx step = total_diff // interval_count # 填充中间缺失值 for j in range(prev_idx + 1, next_idx): processed[j] = sec_to_time(prev_sec + step * (j - prev_idx)) # 跳转到下一个有效位置,避免重复处理 i = next_idx else: i += 1 return processed
测试示例
针对你提供的案例数据进行测试:
# 对应i=2到i=5的出发时间(i=2:14:41:03,i=3/4:0,i=5:14:44:39) sample_times = ["14:41:03", "0", "0", "14:44:39"] filled_times = interpolate_missing_times(sample_times) print(filled_times) # 输出结果:['14:41:03', '14:42:15', '14:43:27', '14:44:39']
注意事项
- 若列表开头或结尾存在连续缺失值,当前代码会保留
0,可根据需求修改(例如用第一个/最后一个有效时间填充) - 若总时间差无法被间隔数整除,代码采用整数除法取整,若需更精确可保留浮点秒数后再转换
内容的提问来源于stack exchange,提问作者Gadman Tang
相关产品推荐
相关产品推荐

