2009-09-18 5 views
2

클럭 시간이 겹치는 두 개의 Org 파일/하위 트리에서 관련 작업이 있습니다. 이것은 수동 작업 로그와 생성 된 git commit 로그입니다 (아래 참조).겹치는 날짜/시간 간격을 어떻게 분할합니까? (조직 모드 시간)?

하나의 하위 트리의 CLOCK : 겹치는 시간을 제거하려면 항목을 조정해야합니다. 다른 하위 트리는 완료된 것으로 간주되며 CLOCK입니다. 항목을 조정하면 안됩니다.

편집 :이 질문은 겹치는 부분을 제거하기위한 새로운 시간 간격 계산에 관한 것입니다. 모든 제안은 조직 모드 파일 형식을 구문 분석 할 필요가 없습니다. Org 모드 함수를 사용하거나 사용하지 않고 Emacs Lisp와 마찬가지로 Python datetime.datetime 알고리즘이 유용합니다. 가 발생 곳

  1. 확인 시간이 겹치는 : (더 익숙한) 파이썬 또는 이맥스 리스프에서

    내가 싶습니다 (조직의 기능을 도울 수). file1.org는 변경 될 수 있습니다. file2.org 시간 간격은 이 고정/수정으로 간주되어야합니다.

  2. 계산 새로운 시간 간격에 대한 상기 클록 : file1.org 의 라인 file2.org 시계 임의의 오버랩을 제거 : 라인.

  3. 새로운 CLOCK을 작성한 행 : 또는 적어도 datetimes입니다.

파이썬 편의 기능 tsparse 파이썬 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) 

테스트 케이스가 아래에서 확인할 수있다. 파이썬이나 이맥스 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: 

답변

2

당신이 파일 형식을 구문 분석하는 데 도움 하시겠습니까? 또는 겹치는 시간을 알아내는 것만으로도?이 같은 것을 수행 할 수 있도록

datetime 개체, 파이썬 필적과 같다 : 제 1 범위 (B)의 단부는 상기 제 범위 (c 및 d) 내에 있으면

>>> (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 

을하고있다 중첩을 사용하면이 두 쌍을 하나의 범위 (a, d)로 병합 할 수 있습니다.

데이터 세트가 매우 작아서이 비교를 수행하고 모든 시간 범위 (N ** 2) 사이에 병합하고 수용 가능한 결과를 얻을 수 있습니다.

관련 문제