我必须将很多csv数据转换为pytable。如果我只将日期存储为字符串,我可以在5小时内完成工作。但是,这对查询操作没有用,所以我希望它是一个整数,或者某种格式使搜索更快。
以下是我的尝试:
np.datetime64(date)
这很快,但pytables不会直接存储它,因为我用numpy结构化数组编写并且不接受类型'M8'。 使用astype转换为int64会大大减慢进程。
ts = time.strptime(date, '%m/%d/%Y')
calendar.timegm(ts)
太慢了。导致总处理时间达到15小时
我只想要一些数字代表自2000年以来的日期数字。我不需要几小时,几秒钟。
有什么想法吗?
答案 0 :(得分:1)
我想知道你是否可以通过使用慢速方法改进,但在计算后将结果缓存在字典中。因此1)检查一个(可能是全局的)字典,看看该字符串是否作为密钥存在;如果是这样,请使用该键的值。 2)如果没有,则计算字符串的日期。 3)将字符串/日期作为键/值添加到字典中以供下次使用。假设你有很多重复项,你必须这样做(因为它听起来你有一大堆数据,并且在2000年至今之间没有那么多不同的日子),那么你将获得一个梦幻般的缓存命中率。从字典中获取是O(1)操作;这应该会改善很多事情。
答案 1 :(得分:-1)
这有点晚了,但我已经为这类任务编写了快速基于Cython的转换器:
https://bitbucket.org/mrkafk/fastdateconverter
基本上,你给它一个日期格式,它会生成Cython代码,然后编译为Python扩展。这使它如此之快,请参阅date_converter_generator.py
中的示例:
fdef1 = FunDef('convert_date_fast', '2014/01/07 10:15:08', year_offset=0,
month_offset=5, day_offset=8, hour_offset=11, minute_offset=14, second_offset=17)
cg = ConverterGenerator([fdef1])
cg.benchmark()