如何用Python合并多卫星重叠的日期时间区间并统计时长
时间区间重叠合并实现方案
方案说明
你需要的区间合并功能没有完全直接的pandas内置单行函数,但可以通过pandas基础能力快速实现,不需要额外安装第三方库。
实现步骤
- 读取所有卫星的原始数据,合并为同一个DataFrame,将起止时间列转换为pandas datetime类型
- 按开始时间对所有区间做升序排序
- 遍历排序后的区间,合并所有重叠或前后衔接的区间
- 基于合并后的起止时间重新计算时长
完整代码示例
import pandas as pd # 1. 读取多份卫星数据并合并 # 以下为示例数据,实际使用时替换为读取你的本地文件即可 data1 = [ [450.61717646411466, '2022-01-01 13:11:18.686564', '2022-01-01 13:18:49.303741'], [272.9796195817538, '2022-01-01 14:45:04.846243', '2022-01-01 14:49:37.825862'] ] data2 = [ [576.600683837155, '2022-01-01 13:06:51.364924', '2022-01-01 13:16:27.965608'], [568.5843137051123, '2022-01-01 14:40:38.840363', '2022-01-01 14:50:07.424677'] ] cols = ['Duration (s)', 'Start Time (UTC)', 'Stop Time (UTC)'] df1 = pd.DataFrame(data1, columns=cols) df2 = pd.DataFrame(data2, columns=cols) # 多文件批量读取可替换为: # df = pd.concat([pd.read_csv(文件路径, sep='\s+') for 文件路径 in 你的文件路径列表], ignore_index=True) df = pd.concat([df1, df2], ignore_index=True) # 2. 转换时间类型并按开始时间排序 df['Start Time (UTC)'] = pd.to_datetime(df['Start Time (UTC)']) df['Stop Time (UTC)'] = pd.to_datetime(df['Stop Time (UTC)']) df = df.sort_values('Start Time (UTC)').reset_index(drop=True) # 3. 合并重叠区间 merged_intervals = [] if not df.empty: current_start, current_end = df.iloc[0][['Start Time (UTC)', 'Stop Time (UTC)']] for _, row in df.iloc[1:].iterrows(): if row['Start Time (UTC)'] <= current_end: # 区间重叠,更新结束时间为两者最大值 current_end = max(current_end, row['Stop Time (UTC)']) else: # 区间不重叠,保存当前区间后切换为新的区间 merged_intervals.append((current_start, current_end)) current_start, current_end = row['Start Time (UTC)'], row['Stop Time (UTC)'] # 补充保存最后一个区间 merged_intervals.append((current_start, current_end)) # 4. 生成结果表并重新计算时长 result = pd.DataFrame(merged_intervals, columns=['Start Time (UTC)', 'Stop Time (UTC)']) result['Duration (s)'] = (result['Stop Time (UTC)'] - result['Start Time (UTC)']).dt.total_seconds() # 调整列顺序和要求一致 result = result[['Duration (s)', 'Start Time (UTC)', 'Stop Time (UTC)']] # 输出查看结果 print(result) # 保存到本地文件:result.to_csv('merged_result.csv', index=False)
结果验证
运行上述代码得到的输出和预期逻辑完全匹配:
Duration (s) Start Time (UTC) Stop Time (UTC) 0 717.938817 2022-01-01 13:06:51.364924 2022-01-01 13:18:49.303741 1 568.584314 2022-01-01 14:40:38.840363 2022-01-01 14:50:07.424677
注:示例期望的第一个时长数值为手动近似值,代码输出为精确时间差计算结果。
内容的提问来源于stack exchange,提问作者lghizoni
相关产品推荐
相关产品推荐

