更快的方法来减少这个非常大的CSV文件的大小?

zzoitvuj  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(105)

我有一个非常大的CSV文件~1GB,我用第三方软件获得,该软件以10.000Hz的采样率记录来自设备的电压信号(我省略了有关软件和设备的详细信息,以保持这个问题简洁)。
我正在处理的特定文件是大约13分钟的数据积累(大约780万行)。我只对文件中6点到13点之间的数据感兴趣。
我想分析和绘制数据,但由于文件的大小,这是一项非常困难的任务。为了使任务更容易,我想从文件中获取数据,并每两帧平均一次。如果我的推理是正确的,这几乎相当于将采样率降低到5 KHz,同时保持一点信息。
我写了一个非常简单的线性时间复杂度的代码,它需要很长时间才能运行...
既然我以后可能要多次这样做,那么有没有更有效的方法来处理这些数据呢?

import pandas as pd
import csv

csv_filename = 'my_path'
header = ['title1', 'title2']

# Skip the first 3,600,001 rows to start analyzing the data at 6 minutes. 

reader = pd.read_csv(csv_filename, header=None, skiprows=3600001, chunksize = 2, names=header)

with open('compressed.csv', 'w', newline='') as file:
    
    writer = csv.writer(file)
    compressed_header = ["time[s]", "Displacement[um]"]
    writer.writerow(compressed_header)

    time = 0
    for chunk in reader:
        mean = chunk["title2"].mean()
        writer.writerow([time, mean])
        time += 1
von4xj4u

von4xj4u1#

数据格式

您希望分析它,因此不需要将其保存回csv。使用一些其他格式,这将是更快的保存和加载后:

*.npy(使用numpy.save)-推荐。选择数据格式,尽可能小(float 32,int 16,int 8?)-选择权在你
*.wav(使用scipy.io.wavfile.write
*.pickle(使用pickle.dump),最容易使用,不推荐使用,因为pickle文件打开时很危险。

如果你真的需要.csv,使用Andrej在评论中建议的方法,计算数据集的平均值,并使用DataFrame.to_csv保存。

忽略时间列

此外,我很肯定你可以跳过时间列,如果采样是均匀的,你可以忘记它,保存大量的空间。
如果你真的需要,你可以保存额外的信息,只包含两个值:采样频率和开始时间。

重采样

在分析数据之前不要重新采样数据,否则您将完全了解数据所包含的频率范围。
使用傅立叶变换(np.fft.fft)并首先绘制它,然后决定可以应用什么重采样。

相关问题