From: "Eric Schulte" <schulte.eric@gmail.com>
To: Bastien <bzg@altern.org>
Cc: emacs-orgmode@gnu.org, Martin Halder <martin.halder@gmail.com>,
mail@christianmoe.com
Subject: Re: org table calc and lisp for hh:mm timetable
Date: Sun, 20 Mar 2011 11:50:23 -0600 [thread overview]
Message-ID: <87r5a1lm00.fsf@gmail.com> (raw)
In-Reply-To: 87k4fynog3.fsf@altern.org
[-- Attachment #1: Type: text/plain, Size: 463 bytes --]
I wrapped Bastien's functions below in a simple macro, which IMO results
in a very nice way to handle time values in Org-mode tables as in the
attached org file (below).
Note, the first argument to the `with-time' macro controls whether
results are returned as a time string or a numerical value. That
argument may be followed by any number of (possibly nested) expressions.
If this looks to be generally useful I'd be happy to post it to worg.
Best -- Eric
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: time.org --]
[-- Type: text/org, Size: 2000 bytes --]
| time | miles | minutes/mile |
|-------+-------+--------------|
| 34:43 | 2.9 | 11:58 |
| 56:00 | 5.5 | 10:10 |
| 31:00 | 3.04 | 10:11 |
| 32:15 | 2.77 | 11:38 |
| 33:56 | 3.0 | 11:18 |
| 72:00 | 6.74 | 10:40 |
| 52:22 | 4.62 | 11:20 |
#+TBLFM: $3='(with-time t (/ $1 $2))
#+begin_src emacs-lisp :results silent
(defun org-time-string-to-seconds (s)
"Convert a string HH:MM:SS to a number of seconds."
(cond
((and (stringp s)
(string-match "\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\)" s))
(let ((hour (string-to-number (match-string 1 s)))
(min (string-to-number (match-string 2 s)))
(sec (string-to-number (match-string 3 s))))
(+ (* hour 3600) (* min 60) sec)))
((and (stringp s)
(string-match "\\([0-9]+\\):\\([0-9]+\\)" s))
(let ((min (string-to-number (match-string 1 s)))
(sec (string-to-number (match-string 2 s))))
(+ (* min 60) sec)))
((stringp s) (string-to-number s))
(t s)))
(defun org-time-seconds-to-string (secs)
"Convert a number of seconds to a time string."
(cond ((>= secs 3600) (format-seconds "%h:%.2m:%.2s" secs))
((>= secs 60) (format-seconds "%m:%.2s" secs))
(t (format-seconds "%s" secs))))
(defmacro with-time (time-output-p &rest exprs)
"Evaluate an org-table formula, converting all fields that look
like time data to integer seconds. If TIME-OUTPUT-P then return
the result as a time value."
(list
(if time-output-p 'org-time-seconds-to-string 'identity)
(cons 'progn
(mapcar
(lambda (expr)
`,(cons (car expr)
(mapcar
(lambda (el)
(if (listp el)
(list 'with-time nil el)
(org-time-string-to-seconds el)))
(cdr expr))))
`,@exprs))))
#+end_src
[-- Attachment #3: Type: text/plain, Size: 1733 bytes --]
Bastien <bzg@altern.org> writes:
> Hi Martin,
>
> Martin Halder <martin.halder@gmail.com> writes:
>
>> this is fantastic, already love lisp, thanks a lot.. now I have exactly
>> what I wanted.. additionally I needed the time format in industrial mode
>> (1h = 100m = 100s), implemented in ihms.
>
> thanks for these functions -- I allowed myself to add them to
> Worg/org-hacks.html, in a new "Times computation" section:
>
> http://orgmode.org/worg/org-hacks.html
>
> I added these functions I myself wrote for a particular purpose:
>
> #+begin_src emacs-lisp
> (defun org-hh:mm:ss-string-to-seconds (s)
> "Convert a string HH:MM:SS to a number of seconds."
> (when (string-match "\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\)" s)
> (let ((hour (string-to-number (match-string 1 s)))
> (min (string-to-number (match-string 2 s)))
> (sec (string-to-number (match-string 3 s))))
> (+ (* hour 3600) (* min 60) sec))))
>
> (defun org-subtract-hh:mm:ss-time (t1 t2)
> "Substract two hh:mm:ss time values."
> (let* ((sec (- (org-hh:mm:ss-string-to-seconds t2)
> (org-hh:mm:ss-string-to-seconds t1)))
> (hour (floor (/ sec 3600)))
> (min (floor (/ (- sec (* 3600 hour)) 60)))
> (secs (round (- sec (* 3600 hour) (* 60 min)))))
> (format "%.2d:%.2d:%.2d" hour min secs)))
> #+end_src
>
> With these function, you can subtract durations in a table like this:
>
> | Part | Begin | End | Duration |
> |-------+----------+----------+----------|
> | One | 00:00:00 | 00:01:11 | 00:01:11 |
> | Two | 00:01:12 | 00:02:00 | 00:00:48 |
> | Three | 00:02:05 | 00:16:06 | 00:14:01 |
> #+TBLFM: $4='(org-subtract-hh:mm:ss-time $2 $3)
>
> Which was useful for me when I had to derush video files.
>
> HTH,
next prev parent reply other threads:[~2011-03-20 17:50 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-15 18:32 org table calc and lisp for hh:mm timetable Martin Halder
2011-03-15 19:22 ` Eric S Fraga
2011-03-15 19:49 ` Martin Halder
2011-03-15 20:37 ` Eric S Fraga
2011-03-15 21:47 ` Christian Moe
2011-03-16 9:22 ` Martin Halder
2011-03-17 7:49 ` Bastien
2011-03-20 17:50 ` Eric Schulte [this message]
2011-03-20 19:57 ` Eric S Fraga
2011-03-20 17:50 ` Eric Schulte
2011-03-20 21:00 ` Christian Moe
2011-03-20 23:43 ` Eric Schulte
2011-03-22 4:40 ` Eric Schulte
2011-03-22 9:36 ` Christian Moe
2011-03-24 1:18 ` Eric Schulte
2011-03-24 18:35 ` Martin Halder
2011-03-22 10:52 ` Carsten Dominik
2011-07-02 11:38 ` Bastien
2011-03-16 9:28 ` Eric S Fraga
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87r5a1lm00.fsf@gmail.com \
--to=schulte.eric@gmail.com \
--cc=bzg@altern.org \
--cc=emacs-orgmode@gnu.org \
--cc=mail@christianmoe.com \
--cc=martin.halder@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).