You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:17:42