如何用Python的Pandas编写代码识别DataFrame中缺失的1分钟时间范围
找出时间序列中缺失的日期范围
嘿,我来帮你搞定这个时间序列缺失范围的问题!咱们用Pandas的时间序列处理能力就能轻松实现,具体方案如下:
实现思路
- 先从完整的
dates序列里揪出那些没出现在采集数据data里的时间点,也就是所有缺失的时刻 - 把连续缺失的时间点合并成一个范围(比如从13:55到14:00),单个缺失的就单独保留
- 最后把这些结果整理成你需要的二维数组格式
完整代码实现
import pandas as pd import datetime def find_missing_date_ranges(full_dates, data_dates): # 把采集数据转成集合,方便快速查找判断 data_set = set(data_dates) # 筛选出完整序列中不在采集数据里的时间点 missing_dates = full_dates[~full_dates.isin(data_set)] # 如果没有缺失,直接返回空列表 if len(missing_dates) == 0: return [] # 计算相邻缺失时间的间隔,找出不连续的位置 time_diff = missing_dates[1:] - missing_dates[:-1] # 找到间隔大于1分钟的索引,这些就是不同缺失区间的分割点 split_points = [0] + list((time_diff > pd.Timedelta(minutes=1)).nonzero()[0] + 1) + [len(missing_dates)] # 遍历分割点,生成对应的缺失范围 missing_ranges = [] for i in range(len(split_points)-1): start_idx = split_points[i] end_idx = split_points[i+1] - 1 # 把时间转成字符串格式,符合输出要求 start_time = missing_dates[start_idx].strftime('%Y-%m-%d %H:%M:%S') end_time = missing_dates[end_idx].strftime('%Y-%m-%d %H:%M:%S') # 单个时间点就存成单元素列表,连续范围就存起始和结束 if start_time == end_time: missing_ranges.append([start_time]) else: missing_ranges.append([start_time, end_time]) return missing_ranges # 测试用的示例数据 dates = pd.date_range("2015-10-08 13:40:00", "2015-10-08 14:12:00", freq="1min") data = pd.to_datetime(['2015-10-08 13:41:00', '2015-10-08 13:42:00', '2015-10-08 13:43:00', '2015-10-08 13:44:00', '2015-10-08 13:45:00', '2015-10-08 13:46:00', '2015-10-08 13:47:00', '2015-10-08 13:48:00', '2015-10-08 13:49:00', '2015-10-08 13:50:00', '2015-10-08 13:51:00', '2015-10-08 13:52:00', '2015-10-08 13:53:00', '2015-10-08 13:54:00', '2015-10-08 14:01:00', '2015-10-08 14:02:00', '2015-10-08 14:03:00', '2015-10-08 14:04:00', '2015-10-08 14:05:00', '2015-10-08 14:06:00', '2015-10-08 14:07:00', '2015-10-08 14:10:00', '2015-10-08 14:11:00', '2015-10-08 14:12:00']) # 调用函数并输出结果 result = find_missing_date_ranges(dates, data) print(result)
代码细节说明
- 快速筛选缺失点:用
isin配合取反操作~,能高效从完整时间序列中定位缺失的时刻,比循环判断快得多 - 分割连续区间:通过计算相邻缺失时间的差值,找到间隔超过1分钟的位置,这些位置就是不同缺失块的分界点
- 格式化输出:把Pandas的时间对象转成字符串格式,并且根据区间长度决定是单元素还是双元素列表,完美匹配你要的二维数组样式
运行这段代码后,你会得到如下输出:
[['2015-10-08 13:40:00'], ['2015-10-08 13:55:00', '2015-10-08 14:00:00'], ['2015-10-08 14:08:00', '2015-10-08 14:09:00']]
(小提醒:你给的期望输出里把13:54写进去了,但实际data里是包含这个时间点的,所以正确的连续缺失区间是从13:55到14:00哦)
内容的提问来源于stack exchange,提问作者georgehere
相关产品推荐
相关产品推荐

