使用 Pandas 格式化纪元时间并对其进行分组



我有一个非常大的数据文件需要解析。我编写了一些组函数,并使用字典,我能够使我的小数据集正常工作。

但是,较大的数据集不起作用。以下是我的数据集在 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。我想使用 panda 加载此文件并在时间间隔内按时间分组。123.0001是纪元时间,有数百个。但是,它们不是线性的。也就是说,他们可能会跳过几秒钟。同一秒也可能记录了几个不同的事件。甚至微秒。

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

我如何使用熊猫?

请注意,我已经使用标准词典和列表在没有熊猫的情况下使用它。但是,生成大型数据集的结果大约需要 3 小时。

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

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

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

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

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

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

由于 CSV 文件相当大,您可能需要分块读取它。您可以通过分组依据/计数操作减小每个区块的大小,然后连接(缩小的(区块。由于生成的 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 的文件应该不到一个小时。

最新更新