在Pandas DatetimeIndex中识别连续数据区间及超10秒无数据区间
处理Pandas DatetimeIndex的连续数据区间与间隔超10秒的无数据区间
需求说明
我有一个Pandas DatetimeIndex,需要找出其中数据连续的区间(相邻时间间隔≤10秒的序列),以及间隔时长超过10秒的无数据区间。
示例展示
- 数据连续区间(首个示例):
['2023-09-12 09:48:28.720000', '2023-09-12 09:48:29.020999936'] - 无数据区间示例:
['2023-09-12 09:48:29.020999936', '2023-09-19 10:27:00.992000']
示例DatetimeIndex代码
import pandas as pd index = pd.to_datetime(['2023-09-12 09:48:28.720000', '2023-09-12 09:48:28.813999872', '2023-09-12 09:48:28.921999872', '2023-09-12 09:48:29.020999936', '2023-09-19 10:27:00.992000', '2023-09-19 10:27:01.192000', '2023-09-19 10:27:01.293999872'])
实现方案
步骤1:计算相邻时间间隔
先算出DatetimeIndex中每两个相邻时间点的差值:
time_diff = index[1:] - index[:-1]
步骤2:提取数据连续区间
通过标记间隔超10秒的分界点,划分出连续数据段,再提取每个段的首尾时间:
# 标记间隔超10秒的位置 breaks = time_diff > pd.Timedelta(seconds=10) # 生成连续区间的首尾索引 start_indices = [0] + (breaks[breaks].index + 1).tolist() end_indices = breaks[breaks].index.tolist() + [len(index)-1] # 格式化输出连续区间 continuous_intervals = [ [index[s].strftime('%Y-%m-%d %H:%M:%S.%f'), index[e].strftime('%Y-%m-%d %H:%M:%S.%f')] for s, e in zip(start_indices, end_indices) ]
步骤3:提取无数据区间
无数据区间就是前一个连续段的结束时间到下一个连续段的开始时间:
missing_intervals = [] for i in range(len(continuous_intervals)-1): missing_intervals.append([continuous_intervals[i][1], continuous_intervals[i+1][0]])
完整运行代码
import pandas as pd # 初始化示例索引 index = pd.to_datetime(['2023-09-12 09:48:28.720000', '2023-09-12 09:48:28.813999872', '2023-09-12 09:48:28.921999872', '2023-09-12 09:48:29.020999936', '2023-09-19 10:27:00.992000', '2023-09-19 10:27:01.192000', '2023-09-19 10:27:01.293999872']) # 计算相邻时间差 time_diff = index[1:] - index[:-1] # 标记间隔超10秒的分界点 breaks = time_diff > pd.Timedelta(seconds=10) # 生成连续区间首尾索引 start_indices = [0] + (breaks[breaks].index + 1).tolist() end_indices = breaks[breaks].index.tolist() + [len(index)-1] # 提取连续区间 continuous_intervals = [ [index[s].strftime('%Y-%m-%d %H:%M:%S.%f'), index[e].strftime('%Y-%m-%d %H:%M:%S.%f')] for s, e in zip(start_indices, end_indices) ] # 提取无数据区间 missing_intervals = [] for i in range(len(continuous_intervals)-1): missing_intervals.append([continuous_intervals[i][1], continuous_intervals[i+1][0]]) # 打印结果 print("数据连续区间:") for interval in continuous_intervals: print(interval) print("\n间隔超10秒的无数据区间:") for interval in missing_intervals: print(interval)
输出结果
数据连续区间: ['2023-09-12 09:48:28.720000', '2023-09-12 09:48:29.020999'] ['2023-09-19 10:27:00.992000', '2023-09-19 10:27:01.293999'] 间隔超10秒的无数据区间: ['2023-09-12 09:48:29.020999', '2023-09-19 10:27:00.992000']
内容的提问来源于stack exchange,提问作者Guido
相关产品推荐
相关产品推荐

