【问题标题】:How do I partition datetime intervals which overlap (Org Mode clocked time)?如何划分重叠的日期时间间隔(组织模式时钟时间)?
【发布时间】:2009-09-18 23:55:09
【问题描述】:

我有来自两个组织文件/子树的相关任务,其中一些时钟时间重叠。这些是手动工作日志和生成的 git 提交日志,见下文。

一个子树的 CLOCK:需要调整条目以消除重叠时间。另一个子树被认为是完整的,它是 CLOCK: 条目不应该被调整。

编辑:这个问题是关于计算新的时间间隔以消除任何重叠。任何建议都不需要解析 Org 模式文件格式。 Python datetime.datetime 算法很有帮助,无论是否使用 Org 模式函数,Emacs Lisp 也是如此。

在 Python(更熟悉)或 Emacs Lisp(Org 函数可以提供帮助)中,我想:

  1. 识别时间重叠的地方 发生。 file1.org 将是可变的, file2.org 时间间隔应该是 被认为是固定的/正确的。

  2. 计算新的时间间隔 时钟:file1.org 中的行 删除任何重叠 file2.org CLOCK:行。

  3. 写入生成的新时钟:行 出局,或者至少是相关的 日期时间。

python 便捷函数 tsparse 将 Org Mode 时间戳转换为 python datetime.datetime 对象:

>>> from datetime import datetime, timedelta
>>> def tsparse(timestring): return datetime.strptime(timestring,'%Y-%m-%d %a %H:%M')
>>> tsparse('2008-10-15 Wed 00:45')
datetime.datetime(2008, 10, 15, 0, 45)

测试用例可以在下面找到。感谢您为 Python 或 Emacs Lisp 提供任何算法或实现建议。

杰夫


file1.org调整之前

* Manually Edited Worklog

** DONE Onsite
   CLOSED: [2009-09-09 Wed 15:00]
   :LOGBOOK:
   CLOCK: [2009-09-09 Wed 07:00]--[2009-09-09 Wed 15:00] =>  8:00
   :END:

** DONE Onsite
   CLOSED: [2009-09-10 Wed 15:00]
   :LOGBOOK:
   CLOCK: [2009-09-10 Thu 08:00]--[2009-09-10 Thu 15:00] =>  7:00
   :END:

file2.org

* Generated commit log

** DONE Commit 1                          :partial:overlap:leading:contained:
   CLOSED: [2009-09-09 Tue 10:18]
   :LOGBOOK:
   CLOCK: [2009-09-09 Wed 06:40]--[2009-09-09 Wed 07:18] =>  0:38
   CLOCK: [2009-09-09 Wed 10:12]--[2009-09-09 Wed 10:18] =>  0:06
   :END:

** DONE Commit 2                               :contained:overlap:contiguous:
   CLOSED: [2009-09-09 Wed 10:20]
   :LOGBOOK:
   CLOCK: [2009-09-09 Wed 10:18]--[2009-09-09 Wed 10:20] =>  0:02
   :END:

** DONE Commit 4                                          :contained:overlap:
   CLOSED: [2009-09-10 Wed 09:53]
   :LOGBOOK:
   CLOCK: [2009-09-10 Wed 09:49]--[2009-09-10 Wed 09:53] =>  0:04
   :END:

** DONE Commit 5                                   :partial:overlap:trailing:
   CLOSED: [2009-09-10 Wed 15:12]
   :LOGBOOK:
   CLOCK: [2009-09-10 Wed 14:45]--[2009-09-10 Wed 15:12] =>  0:27
   :END:

** DONE Commit 6                                    :partial:overlap:leading:
   CLOSED: [2009-09-11 Fri 08:05]
   :LOGBOOK:
   CLOCK: [2009-09-11 Fri 07:50]--[2009-09-11 Fri 08:05] =>  0:15
   :END:

** DONE Commit 7                                                 :nonoverlap:
   CLOSED: [2009-09-11 Fri 15:55]
   :LOGBOOK:
   CLOCK: [2009-09-11 Fri 15:25]--[2009-09-11 Fri 15:55] =>  0:30
   :END:

file1.org调整后

* Manually Edited Worklog

** DONE Onsite
   CLOSED: [2009-09-09 Wed 15:00]
   :LOGBOOK:
   CLOCK: [2009-09-09 Wed 10:20]--[2009-09-09 Wed 14:45] =>  4:25
   CLOCK: [2009-09-09 Wed 07:18]--[2009-09-09 Wed 10:12] =>  2:54
   :END:

** DONE Onsite
   CLOSED: [2009-09-10 Wed 15:00]
   :LOGBOOK:
   CLOCK: [2009-09-10 Thu 08:05]--[2009-09-10 Thu 15:00] =>  6:55
   :END:

【问题讨论】:

    标签: python datetime emacs overlap org-mode


    【解决方案1】:

    您需要帮助解析文件格式吗?还是只是在计算重叠时间?

    datetime 对象在 Python 中具有可比性,因此您可以这样做:

    >>> (a,b) = (datetime(2009, 9, 15, 8, 30), datetime(2009, 9, 15, 8, 45))
    >>> (c,d) = (datetime(2009, 9, 15, 8, 40), datetime(2009, 9, 15, 8, 50))
    >>> a <= b
    True
    >>> if c <= b <= d:
    ...     print "overlap, merge these two ranges"
    ... else:
    ...     print "separate ranges, leave them alone"
    ...
    overlap, merge these two ranges
    

    如果第一个范围 (b) 的结尾在第二个范围 (c 和 d) 内,则存在重叠,您可以将这两个对合并到一个范围 (a,d) 中。

    由于您的数据集看起来非常小,您可能只需进行此比较并在所有时间范围 (N**2) 之间合并并获得可接受的结果。

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多