我正在尝试从Racket中的大型csv文件中解析日期。
最直接的方法是创建一个新的date
结构。但它需要week-day
和year-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/19
有string->date
函数,但我必须更改所有内容以使用该模块的结构而不是racket的内置结构。并且它可能会遇到与发现秒相同的性能,我不确定。
答案 0 :(得分:7)
虽然没有这样记录,但在week-day
结构与year-day
一起使用时,date
和date->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-day
和year-day
将是有趣的信息。那么对于date->seconds
,而不是定义另一个缺少这些字段的结构(它们是“冗余的”,用于确定日期,这就是为什么你可以理解为烦恼:))与date->seconds
一起使用,相同的结构被重用。
这有帮助吗?我从您的问题中不清楚您要对CSV中的日期信息做些什么。如果您想将其转换为整数seconds
值,我认为以上内容适合您。如果您有其他想法,也许您可以解释一下。
答案 1 :(得分:3)
我想说这是racket/date
的疏忽。
对find-seconds
的调用很昂贵,因为它需要搜索以查找秒数。而且因为你只需要知道一周的工作量就不必要了。
写信给邮件列表以获取建议。