【问题标题】:How to efficiently convert dates in numpy record array?如何有效地转换 numpy 记录数组中的日期?
【发布时间】:2012-07-21 02:54:54
【问题描述】:

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

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

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

将转换后的值存储在字典 {string dates: datetime obj} 中并在进行不必要的转换之前先检查字典会更快吗?

或者我应该使用 numpy 函数(我还是 numpy 库的新手)?

【问题讨论】:

  • 你能告诉我们在 csv 文件中使用什么日期格式吗?我认为fromfunction() 可以在这里提供帮助,但我需要更多信息。
  • 如果所有这些都在一天之内,那么使转换变得更简单应该很容易。您只需要解析一次日期。之后,您只需像这样转换秒数:lambda x: int(x[-11:-9]) * 3600 + int(x[-8:-6]) * 60 + int(x[-5:-3])
  • 处理整个csv文件需要多长时间?
  • 当前设计大约需要两分钟。

标签: python numpy


【解决方案1】:

我可能是错的,但在我看来,您的问题是重复出现,因此执行相同转换的次数超出了必要的次数。 如果解释正确,最有效的方法将取决于有多少重复。如果你在 170 万次中有 100,000 次重复,那么将 160 万次写入字典并检查 170 万次可能不会更有效,因为它执行 1.6+170 万次读取/写入。但是,如果您有 100 万次重复,那么为那些返回答案 (O(1)) 而不是额外进行一百万次转换会快得多。

不过,总而言之,python 非常慢,鉴于您使用 170 万个输入,您可能根本无法加快速度。至于numpy函数,我也不是很精通,但我相信网上有一些很好的文档。

【讨论】:

  • 日期(精确到一秒)仅存在 1 天。因此最多有 86,400 个日期。目前,该应用程序正在进行 340 万次转换。我确实承认字典方法几乎肯定会大大加快速度。我主要是咨询堆栈,看看它们是否是我没有想到的其他方式(或 numpy 中的东西)。
  • 啊,我明白了,在这种情况下,我同意,IMO,字典是最快的方法。我怀疑 numpy 有办法做到这一点,并且可能有非常复杂的方法可以提供更好的结果,但是权衡所有因素,字典可能是最好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2018-02-15
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
相关资源
最近更新 更多