2

2 つの組織ファイル/サブツリーから関連するタスクがあり、計測された時間の一部が重複しています。これらは、手動の作業ログと生成された git コミット ログです。以下を参照してください。

1 つのサブツリーの CLOCK: エントリを調整して、重複する時間を削除する必要があります。もう一方のサブツリーは完全であると見なされ、それは CLOCK です。エントリは調整されるべきではありません。

編集: この質問は、オーバーラップを削除するための新しい時間間隔の計算に関するものです。Org モードのファイル形式を解析する必要はありません。Python の datetime.datetime アルゴリズムは役に立ちます。Emacs Lisp は、Org モード関数を使用するかどうかに関係なく役立ちます。

Python (より親しみやすい) または Emacs Lisp (Org 関数が役立つ可能性があります) では、次のことを行います。

  1. 時間の重複が発生する場所を特定します。file1.org は変更可能であり、file2.org の時間間隔は固定/正確であると見なす必要があります。

  2. file1.org の CLOCK: 行の新しい時間間隔を計算して、file2.org の CLOCK: 行とのオーバーラップを削除します。

  3. 結果の新しいCLOCKを書き込みます:行、または少なくとも関連する日時。

Python の簡易関数 tsparse は、組織モードのタイムスタンプを 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:
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) の終わりが 2 番目の範囲 (c および d) 内にある場合、重複があり、これらの 2 つのペアを 1 つの範囲 (a、d) にマージできます。

データのセットがかなり小さいように見えるので、おそらくこの比較を行い、すべての時間範囲 (N**2) をマージして、許容できる結果を得ることができます。

于 2009-09-19T03:34:42.787 に答える