2 つの組織ファイル/サブツリーから関連するタスクがあり、計測された時間の一部が重複しています。これらは、手動の作業ログと生成された git コミット ログです。以下を参照してください。
1 つのサブツリーの CLOCK: エントリを調整して、重複する時間を削除する必要があります。もう一方のサブツリーは完全であると見なされ、それは CLOCK です。エントリは調整されるべきではありません。
編集: この質問は、オーバーラップを削除するための新しい時間間隔の計算に関するものです。Org モードのファイル形式を解析する必要はありません。Python の datetime.datetime アルゴリズムは役に立ちます。Emacs Lisp は、Org モード関数を使用するかどうかに関係なく役立ちます。
Python (より親しみやすい) または Emacs Lisp (Org 関数が役立つ可能性があります) では、次のことを行います。
時間の重複が発生する場所を特定します。file1.org は変更可能であり、file2.org の時間間隔は固定/正確であると見なす必要があります。
file1.org の CLOCK: 行の新しい時間間隔を計算して、file2.org の CLOCK: 行とのオーバーラップを削除します。
結果の新しい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: