2

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

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

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

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

  1. 确定它们发生的时间重叠。file1.org 将是可变的,file2.org 时间间隔应被视为固定/正确。

  2. 为 file1.org 中的 CLOCK: 行计算新的时间间隔,以消除与 file2.org CLOCK: 行的任何重叠。

  3. 写出新的 CLOCK: 行,或者至少是相关的日期时间。

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:

文件 2.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:
4

1 回答 1

2

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

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)之间合并并获得可接受的结果。

于 2009-09-19T03:34:42.787 回答