【问题标题】:Using Pandas to format epoch times and group them使用 Pandas 格式化纪元时间并将它们分组
【发布时间】:2013-06-06 14:59:35
【问题描述】:

我有一个非常大的数据文件需要解析。我编写了一些组函数并使用字典来处理我的小型数据集。

但是,更大的数据集不起作用。这是我的数据集在 csv 文件中的样子:

123.0001, 'axis a', 'axis b', 'axis c'
123.0002, 'axis a', 'axis b', 'axis c'
123.0003, 'axis a', 'axis b', 'axis c'
123.0003, 'axis a', 'axis b', 'axis c'
123.0009, 'axis a', 'axis b', 'axis c'

文件大小约为 20 GB。我想使用熊猫加载这个文件并按时间分组。 123.0001 是纪元时间,有数百个。但是,它们不是线性的。也就是说,他们可能会跳过几秒钟。同一秒内可能还会记录一些不同的事件。甚至是微秒。

假设我想将它们分成 1 分钟间隔的块,并计算在设定的间隔中有多少。

我将如何使用 pandas 来做到这一点?

注意,我已经使用标准字典和列表在没有 pandas 的情况下工作。但是,为大型数据集生成结果大约需要 3 个小时。

如果您有更好的解决方案,请告诉我。

【问题讨论】:

  • 相关:this SO questionthis pull request 即将对 pandas 进行增强
  • A) 阅读本身需要多长时间? B) 你厌倦了使用sort() 吗?排序后的数据要容易得多,幸运的是你的问题可以通过排序来解决。可能 Panda 也已经包含了优化排序!

标签: python pandas


【解决方案1】:

df = read_csv(filename, header=None) 读入文件。然后使用类似...的方式将第一列转换为时间戳。

nanoseconds = (10e9*df[0]).astype('int')
df[0] = nanoseconds.apply(pd.Timestamp)

我假设您的纪元时间以秒为单位并将它们转换为纳秒。

然后使用 pandas 的 groupby 和/或重新采样功能来做任何你想做的事情。

请参阅我对您的问题的评论中的链接,了解相关问题和有关即将进行的改进的信息,这些改进将使这变得不那么尴尬。

【讨论】:

  • 我想知道to_datetime是否比apply(pd.Timestamp)快?当然,这将是 0.11.1 的唯一选择 :)
  • 哦,真的吗?我不知道。我们正在失去Timestamp?哦,也许你的意思正好相反:'Series' object has no attribute 'to_datetime' on 0.11.1.dev...
  • Nono,我只是说pd.to_datetime(df[0], unit='s') 将是更明显的选择(而且速度更快)。 :)
  • 好电话:pd.to_datetime 胜率约为 15%,即使没有 unit
  • pd.to_datetime 如果 cython 没有升起应该更快(在这种情况下,它基本上会退回到 apply(Timestamp)
【解决方案2】:

由于 CSV 文件相当大,您可能需要分块读取它。您可以通过 groupby/count 操作减少每个块的大小,然后连接(减少的)块。由于生成的 DataFrame 可能具有具有相同索引的行(由于来自不同块的行具有相同的 timestamp//60),我们现在需要执行 groupby/sum 操作来组合具有相同索引的行的计数:

import pandas as pd
# Choose chunksize to be a large but manageable number of lines
chunksize = 10**5
chunks = pd.read_csv(filename, chunksize=chunksize, header=None)
freqs = pd.concat(chunk.groupby(chunk[0]//60).count() for chunk in chunks)
freqs = freqs.groupby(freqs.index).sum()

在一个 1.3GB 的文件上,上面的代码在我的机器上运行了大约 150 秒。所以处理一个 20GB 的文件应该不到一个小时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2021-01-01
    • 2020-08-03
    • 2016-06-07
    • 2019-09-26
    • 2012-09-27
    • 2021-10-31
    相关资源
    最近更新 更多