Python中的时间范围重叠算法

2024-02-18

我有一个包含不同 ID、开始日期和结束日期的列表, 让我们说:

[
(5, d.datetime(2010, 9, 19, 0, 0, 0),    d.datetime(2010, 9, 19, 0, 5, 10)),
(6, d.datetime(2010, 9, 19, 0, 0, 0),    d.datetime(2010, 9, 19, 12, 59, 59)),
(4, d.datetime(2010, 9, 19, 10, 30, 17), d.datetime(2010, 9, 19, 20, 20, 59)),
(6, d.datetime(2010, 9, 19, 14, 12, 0),  d.datetime(2010, 9, 19, 23, 59, 59)),
(5, d.datetime(2010, 9, 19, 17, 0, 22),  d.datetime(2010, 9, 19, 19, 14, 20))
]

我需要以某种方式找到重叠的时间范围,并准备具有在特定时间范围内覆盖的正确 ID 的新列表,例如上面的列表结果应该是:

[
('5,6',   d.datetime(2010, 9, 19, 0, 0, 0),    d.datetime(2010, 9, 19, 0, 5, 10),
('6',     d.datetime(2010, 9, 19, 0, 5, 10),   d.datetime(2010, 9, 19, 10, 30, 17),
('4,6',   d.datetime(2010, 9, 19, 10, 30, 17), d.datetime(2010, 9, 19, 12, 59, 59),
('4',     d.datetime(2010, 9, 19, 12, 59, 59), d.datetime(2010, 9, 19, 14, 12, 0),
('4,6',   d.datetime(2010, 9, 19, 14, 12, 0),  d.datetime(2010, 9, 19, 17, 0, 22),
('4,5,6', d.datetime(2010, 9, 19, 17, 0, 22),  d.datetime(2010, 9, 19, 19, 14, 20),
('4,6',   d.datetime(2010, 9, 19, 19, 14, 20), d.datetime(2010, 9, 19, 20, 20, 59),
('6',     d.datetime(2010, 9, 19, 20, 20, 59), d.datetime(2010, 9, 19, 23, 59, 59)
]

视觉概念:

实际上现在我有这样的解决方案:我正在获取整个范围的最小和最大日期,然后开始每 1 秒从 min_date 到 max_date 迭代,特别是当我们匹配目标列表中的一些间隔时,我保存匹配的ids 作为字典键,并将迭代器中的时间作为值附加到列表,然后将其保存到父列表,然后是下一个和下一个。最后,我检查父列表中的所有字典,并将 ids 作为键,将值列表中的第一个、最后一个日期作为我需要查找的范围。 但是当我以月份为单位计算范围时,这个解决方案的工作速度非常慢。因为以秒为单位迭代 1 个月需要太多时间。

这是代码:

    def delta(start, end, delta):
        cur = start
        while cur < end:
            yield cur
            cur += delta

    final_ranges = []
    last_result = None
    i = -1
    for checker_date in delta(
            sorted_ranges_by_start[0]['start'],
            sorted_ranges_by_end[-1]['end'],
            relativedelta(seconds=1)):

        aggregator = []
        for rng in ranges:
            if rng['start'] <= checker_date <= rng['end']:
                aggregator.append(str(rng['id']))

        if len(aggregator) > 0:
            ids = ','.join(set(aggregator))
            if last_result != ids:
                final_ranges.append({})
                last_result = ids
                i += 1

            if ids not in final_ranges[i]:
                final_ranges[i][ids] = []

            final_ranges[i][ids].append(checker_date)

但正如我所说,它在大范围内运行速度非常慢。

通过这种方式,请帮助我找到不需要迭代一个月就能完成的算法,或者建议任何提高迭代速度的方法(不确定,也许尝试在 C 上编写这部分,然后嵌入到 Python 中)

Thanks.


为每个间隔创建两条记录:{id, time, start/end}

按时间比较的所有这些记录的排序列表。如果时间字段相同,请比较开始/结束字段并首先选择结束。

浏览一下列表。

当遇到开始记录时,添加id到active list, 找时间last time

当遇到结束记录时,输出active list with last time标签到结果,然后从活动列表中删除 id。改变last time

让我们有间隔

 A: 0..3
 B: 1..2
 C: 2..4

Records:

 (A,0,s), (A,3,e), (B,1,s), (B,2,e), (C,2,s), (C,4,e)

Sorted:

 (A,0,s), (B,1,s), (B,2,e), (C,2,s), (A,3,e), (C,4,e)

步行排序列表:

  current      active      output         last time
  (A,0,s)      A            -              0           
  (B,1,s)      A,B        A 0..1           1
  (B,2,e)      A          A,B 1..2         2
  (C,2,s)      A,C          -              2
  (A,3,e)      C          A,C  2..3        3
  (C,4,e)      -          C 3..4           4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python中的时间范围重叠算法 的相关文章

随机推荐

  • 类型“Int32”不符合协议“AnyObject”Swift?

    我有一个模型 子类NSObject 如下所示 class ConfigDao NSObject var categoriesVer Int32 Int32 var fireBallIP String String var fireBallP
  • CMake:如何将编译器标志添加到非默认编译器

    你好 我想用英特尔编译器构建一个项目 使用默认的 gcc 我通常运行 cmake DCMAKE CXX FLAGS I some path path to project 这很好用 cmake DCMAKE CXX COMPILER icp
  • maven 找不到我的本地工件

    我似乎无法奔跑mvn o package因为它抱怨 存储库系统已离线但工件 com liferay portal util bridges jar 6 1 20 在以下版本中不可用 本地存储库 但我检查了我的本地存储库 该工件确实存在于那里
  • cakephp 2 CakeEmail 无法发送电子邮件错误

    我正在尝试让 CakeEmail 正常工作 但收到 无法发送电子邮件 内部错误 堆栈跟踪的最后一行是 CORE Cake Network Email MailTransport php line 47 gt MailTransport gt
  • React JSX 与当前组件的函数调用

    const Component text gt div text div const Example gt div div
  • libgdx sprite 和 actor 之间的区别

    我正在浏览有关 libgdx 的 javadoc 和各种教程 并且正处于尝试找出与我相似或在 libgdx 中提供类似功能的各种概念之间的差异的阶段 起初我认为 scene2d 是关于创建交互式项目 例如菜单等 但我正在阅读的各种教程使用
  • 为什么我的 VS Code 智能感知建议“i”使用“await”关键字? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我输入 i 时 智能感知会将字符 i 更改为 awa it 并使该方法异步 当我为语句编写代码时 这真的很困扰我 当我只用 C 编程而不
  • 创建 HWND 的最简单方法

    我需要 MSVC 中的虚拟窗口 它永远不可见 甚至在应用程序的主窗口之前创建 它是渲染引擎所需要的 因此 如果可能的话 我宁愿不必注册课程 为了测试 最好让它可见以证明它的存在 我可以使用静态或按钮或其他东西吗 我一直在尝试使用 Creat
  • 将我的应用程序推送到 Heroku 时,为什么会收到错误 500“我们很抱歉,但出了点问题”?

    我将我的应用程序推送到 Heroku 并收到 我们很抱歉 但出了点问题 500 为什么是这样 我知道错误消息来自 public 目录中我自己的文件之一 标题为 500 html 但我不确定为什么会发生这种情况 我的 heroku 日志以及我
  • apache Spark sql 中的缓存表

    来自 Spark 官方document http spark apache org docs latest sql programming guide html caching data in memory 它说 Spark SQL 可以通
  • 如何在 Javascript 循环中重新绘制 HTML 元素?

    我有一些 Javascript 可以在 HTML 元素上 动画 颜色变化 如下所示 var element document getElementById someid while i lt 255 element style color
  • 仅通过 GDI+ 和 DotNet 指定大小来创建 Dib

    我最近刚刚发现 GDI 中不同构造函数之间的差异 去 var bmp new Bitmap width height pixelFormat 创建 DDB 设备相关位图 而 var bmp new Bitmap someFile 创建 DI
  • 字符串必须正好是一个字符长

    我有一个我认为很简单的问题 由于某种原因 以下代码生成异常 字符串必须恰好是一个字符长 int n 0 foreach char letter in charMsg Get the integral value of the charact
  • 2D 循环卷积与卷积 FFT [Matlab/Octave/Python]

    我试图理解 FTT 和卷积 互相关 理论 因此我创建了以下代码来理解它 代码是 Matlab Octave 但我也可以用 Python 来完成 In 1D x 5 6 8 2 5 y 6 1 3 5 1 x1 x zeros 1 4 y1
  • Android DataBinding 泄漏内存

    我正在使用数据绑定并且我已经声明了lateinit var对于绑定以及当我要使用不同的片段 Leaky canary 显示泄漏时 Fragment class HomeFragment BottomNavViewHostBaseFragme
  • SemaphoreSlim.WaitAsync 延续代码

    我的理解await关键字是下面的代码await合格的语句在完成后将作为该语句的延续运行 因此以下两个版本应该产生相同的输出 public static Task Run SemaphoreSlim sem TraceThreadCount
  • VSCode 中的 Python 路径

    我在 Mac OSX 10 14 2 上安装了 Anaconda 发行版 有了它 我安装了 VSCode 我将用它来编写 python 脚本 最近 我更新了 Anaconda 中的一些环境 VSCode 用于其集成终端的 python 路径
  • 为不同语言生成不同的 docpad 集合

    我想调整我的多语言 DocPad 博客 以便以 ru md 结尾的页面进入 ru 目录 以 en md 结尾的页面进入 en 目录 假设这是初始结构 src pages page1 ru md page1 en md page2 ru md
  • 如何检查json数组是否有值?

    我正在使用条件 if obj2 getString patronCheckoutInfo equals null 但它不适用于数组获取值的情况 例如 情况 1 当 json 获取 patronCheckoutInfo 的值时 ErrorMe
  • Python中的时间范围重叠算法

    我有一个包含不同 ID 开始日期和结束日期的列表 让我们说 5 d datetime 2010 9 19 0 0 0 d datetime 2010 9 19 0 5 10 6 d datetime 2010 9 19 0 0 0 d da