Как разделить перекрывающиеся интервалы между датой и временем (время в режиме Org) - PullRequest
2 голосов
/ 19 сентября 2009

У меня есть связанные задачи из двух файлов / поддеревьев Org, где частично совпадает время синхронизации. Это ручной журнал и сгенерированный журнал git commit, см. Ниже.

CLOCK одного поддерева: записи должны быть скорректированы, чтобы удалить время наложения. Другое поддерево считается завершенным, и оно CLOCK: записи не должны корректироваться.

РЕДАКТИРОВАТЬ: Этот вопрос о вычислении новых временных интервалов для устранения любых перекрытий. Любые предложения не нужно анализировать формат файла режима Org. Полезны алгоритмы Python datetime.datetime, как и Emacs Lisp с использованием или без использования функций режима Org.

В Python (более знакомо) или Emacs Lisp (функции Org могут помочь) я хотел бы:

  1. Определите время совпадения, где они происходят. file1.org будет изменчивым, интервалы времени file2.org должны быть считается исправленным / правильным.

  2. Расчет новых временных интервалов для ЧАСЫ: строки в file1.org удалить любое перекрытие с file2.org ЧАСЫ: линии.

  3. записать полученный новый CLOCK: строки или, по крайней мере, уместно DateTimes.

Функция удобства Python tsparse преобразует временную метку режима Org в объект 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.

Jeff


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:

1 Ответ

2 голосов
/ 19 сентября 2009

Хотите помочь с анализом формата файла? Или просто выяснить время перекрытия?

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) и получить приемлемый результат.

...