12

我正在尝试从 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应该这么慢(即错误)?还是我做错了什么?

3.)是否有任何替代方法可以快速解析日期。我知道srfi/19有一个string->date功能,但是我必须更改所有内容以使用该模块的结构而不是球拍的内置结构。它可能会遭受与 find-seconds 相同的性能损失,我不确定。

4

2 回答 2

7

尽管没有这样记录,但week-dayyear-daydate结构与date->seconds. 如果我将它们都设置为 0,则 adate->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, where一起使用,week-day并且year-day会提供有趣的信息。然后 for date->seconds,而不是定义另一个缺少这些字段的结构(它们是“多余的”用于确定日期,这就是为什么你会感到恼火的原因:))用于 with date->seconds,而是重用了相同的结构。

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

于 2012-08-21T01:09:16.920 回答
3

我会说这是一个疏忽racket/date

调用find-seconds很昂贵,因为它需要搜索以找到秒数。而且由于您只需要知道工作日,因此这是不必要的计算。

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

于 2012-08-19T11:42:45.077 回答