2012-07-20 93 views
1

我必须读一个非常大的(170万条记录)csv文件到一个numpy记录数组。其中两列是需要转换为日期时间对象的字符串。此外,一列需要计算这些日期之间的差异。如何有效地转换numpy记录数组中的日期?

目前我做了一个自定义的迭代器类,它构建了一个列表列表。然后我使用np.rec.fromrecords将其转换为数组。

但是,我注意到调用datetime.strptime()这么多次真的会减慢速度。我想知道是否有更有效的方法来完成这些转换。时间在日期范围内精确到秒。所以,假设时间是均匀分布的(他们不是),看起来我正在做更多20倍的必要转换(170万/(60 X 60 X 24)。

会更快地存储在字典{字符串日期:日期时间OBJ}转换值和第一查了字典,做不必要的转换之前

或者我应该使用numpy的功能(我还是新来的numpy的库)

+0

你能告诉我们在csv文件中使用什么日期格式吗?我会假设'fromfunction()'可以在这里帮助,但我需要稍微更多的信息。 – Wolph 2012-07-20 18:51:54

+0

19-JUL-12 02.05.53 PM – 2012-07-20 19:05:51

+0

如果所有这些都在一天之内,应该很容易使转换变得更简单。你只需要解析一次日期。在这之后,您只需将这样的秒数转换为:'lambda x:int(x [-11:-9])* 3600 + int(x [-8:-6])* 60 + int(x [-5: - 3])' – Wolph 2012-07-20 19:12:20

回答

0

我?可能是错误的,但在我看来你的问题是重复发生,因此做了相同的转换次数超过必要的IF解释是正确的,t他最有效的方法将取决于有多少重复。如果在170万次中有10万次重复,那么将160万次写入字典并检查170万次可能效率更高,因为它的读取/写入次数为1.6 + 1.7百万次。但是,如果您有一百万次重复,那么为这些人返回一个答案(O(1)),而不是进行额外百万倍的转换会快得多。

总而言之,虽然python非常慢,并且根据您使用的170万个输入,您可能无法加速这一切。至于numpy函数,我也不是很精通,但我相信在线有一些很好的文档。

+0

日期(精确到秒)仅在1天内存在。因此最多有86,400个日期。目前该应用程序正在进行340万次转换。我承认字典方法几乎肯定会加快它的速度。我主要是咨询堆栈,看看他们是否有其他方式,我没有想到(或在numpy的东西)。 – 2012-07-20 19:03:47

+0

唉好的我明白了,在这种情况下,我会同意,IMO,字典是最快的方法。我怀疑numpy是否有办法做到这一点,并且可能有非常复杂的方法可以给出更好的结果,但考虑到所有因素,字典可能是最好的。 – Adam 2012-07-23 13:53:11

相关问题