Python 使用熊猫格式化大纪元并将其分组

Python 使用熊猫格式化大纪元并将其分组,python,pandas,Python,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

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

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

假设我想把他们分成1分钟的间隔,并计算出在一个固定的间隔内有多少人

我如何使用熊猫来做到这一点

注意,我已经在没有熊猫的情况下使用了标准字典和列表。然而,为一个大型数据集生成结果大约需要3个小时


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

使用
df=Read\u csv(filename,header=None)读取文件。
。然后使用类似于

nanoseconds = (10e9*df[0]).astype('int')
df[0] = nanoseconds.apply(pd.Timestamp)
我假设你们的大纪元时间是秒,并把它们转换成纳秒

然后使用pandas的groupby和/或重采样功能执行您想执行的任何操作


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

使用
df=Read\u csv(filename,header=None)
读取文件。然后使用类似于

nanoseconds = (10e9*df[0]).astype('int')
df[0] = nanoseconds.apply(pd.Timestamp)
我假设你们的大纪元时间是秒,并把它们转换成纳秒

然后使用pandas的groupby和/或重采样功能执行您想执行的任何操作


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

由于CSV文件相当大,您可能需要分块阅读。您可以通过groupby/count操作减小每个块的大小,然后连接(减少的)块。由于生成的数据帧可能具有具有相同索引的行(由于来自不同块的行具有相同的
时间戳//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的文件需要不到一个小时。

由于CSV文件相当大,您可能需要分块读取。您可以通过groupby/count操作减小每个块的大小,然后连接(减少的)块。由于生成的数据帧可能具有具有相同索引的行(由于来自不同块的行具有相同的
时间戳//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的文件需要不到一个小时。

相关:对于即将推出的pandasA增强功能,读取本身需要多长时间?B) 您是否厌倦了使用
sort()
?排序数据要容易得多,幸运的是,您的问题可以通过排序来解决。也许熊猫已经包括了一个优化排序,太!相关报道:对于即将进行的pandasA增强,阅读本身需要多长时间?B) 您是否厌倦了使用
sort()
?排序数据要容易得多,幸运的是,您的问题可以通过排序来解决。也许熊猫已经包括了一个优化排序,太!我想知道
to_datetime
是否比
应用(pd.Timestamp)
更快?当然,这将是唯一的选择来0.11.1:)哦,真的吗?我不知道。我们正在丢失
时间戳
?哦,也许你的意思正好相反:
'Series'对象在
0.11.1.dev上没有属性“to_datetime”
Nono,我只是说
pd.to_datetime(df[0],unit='s')
将是更明显的选择(而且更快)。:)好主意:
pd.to\u datetime
赢了大约15%,即使没有
unit
pd.to\u datetime
如果cython不提升,应该更快(在这种情况下,它基本上依赖于
apply(Timestamp)
。我想知道
to\u datetime
是否比
apply(pd.Timestamp)更快
?当然,这将是唯一的选择(0.11.1:)哦,真的吗?我不知道。我们正在丢失
时间戳
?哦,也许你的意思正好相反:
'Series'对象在
0.11.1.dev上没有属性“to_datetime”
Nono,我只是说
pd.to_datetime(df[0],unit='s')
将是更明显的选择(而且更快)。:)好的呼叫:
pd.to\u datetime
赢了大约15%,即使没有
unit
pd.to\u datetime
如果cython不升起(在这种情况下,它基本上依赖于
apply(Timestamp)
)。