试图从Racket中的字符串创建日期 - find-seconds非常慢,每周工作日需要吗?

时间:2012-08-19 02:52:43

标签: datetime racket

我正在尝试从Racket中的大型csv文件中解析日期。

最直接的方法是创建一个新的date结构。但它需要week-dayyear-day参数。当然我没有这些,这似乎是我不理解的date模块的真正弱点。

因此,作为替代方案,我决定使用find-seconds将原始日期值转换为秒,然后将其传递给seconds->date。这有效,但速度很慢。

(time
 (let loop ([n 10000])
   (apply find-seconds '(0 0 12 1 1 2012)) ; this takes 3 seconds for 10000
   ;(date 0 0 12 1 1 2012 0 0 #f 0) ; this is instant
   (if (zero? n)
       'done
       (loop (sub1 n)))))

find-seconds需要3秒才能完成10000个值,而我有几百万个值。创建date结构当然是即时的,但我没有工作日的年日值。

我的问题是:

1。)为什么创建日期结构需要week-day / year-day

2。)find-seconds应该是这么慢(即bug)吗?或者我做错了什么?

3。)有没有其他方法可以快速解析日期。我知道srfi/19string->date函数,但我必须更改所有内容以使用该模块的结构而不是racket的内置结构。并且它可能会遇到与发现秒相同的性能,我不确定。

2 个答案:

答案 0 :(得分:7)

虽然没有这样记录,但在week-day结构与year-day一起使用时,datedate->seconds似乎是“无操作”。如果我将它们都设置为0,则date->seconds不会抱怨。我怀疑它忽略了它们:

#lang racket

(require racket/date)

(define d (date 1    ;sc
                2    ;mn
                3    ;hr
                20   ;day
                8    ;month
                2012 ;year
                0    ;weekday  <<<
                0    ;year-day <<<
                #f   ;dst?
                0    ;time-zone-offset
                ))

(displayln (seconds->date (date->seconds d)))

;; =>
#(struct:date* 1 2 3 20 8 2012 1 232 #t -14400 0 EDT)
                               ^ ^^^

我的猜测是date结构定义为与seconds->date一起使用,其中week-dayyear-day将是有趣的信息。那么对于date->seconds,而不是定义另一个缺少这些字段的结构(它们是“冗余的”,用于确定日期,这就是为什么你可以理解为烦恼:))与date->seconds一起使用,相同的结构被重用。

这有帮助吗?我从您的问题中不清楚您要对CSV中的日期信息做些什么。如果您想将其转换为整数seconds值,我认为以上内容适合您。如果您有其他想法,也许您可​​以解释一下。

答案 1 :(得分:3)

我想说这是racket/date的疏忽。

find-seconds的调用很昂贵,因为它需要搜索以查找秒数。而且因为你只需要知道一周的工作量就不必要了。

写信给邮件列表以获取建议。