我想要使用xrray将许多大型.csv文件转换为.nc(即netCDF文件)。但是,我发现保存.nc文件需要很长时间,并且生成的.nc文件比原始的.csv文件大得多(比原来的.csv文件大4倍到12倍)。
下面是示例代码,用于显示相同数据如何生成大小比.csv中保存的文件大4倍的.nc文件
import pandas as pd
import xarray as xr
import numpy as np
import os
# Create pandas DataFrame
df = pd.DataFrame(np.random.randint(low=0, high=10, size=(100000,5)),
columns=['a', 'b', 'c', 'd', 'e'])
# Make 'e' a column of strings
df['e'] = df['e'].astype(str)
# Save to csv
df.to_csv('df.csv')
# Convert to an xarray's Dataset
ds = xr.Dataset.from_dataframe(df)
# Save NetCDF file
ds.to_netcdf('ds.nc')
# Compute stats
stats1 = os.stat('df.csv')
stats2 = os.stat('ds.nc')
print('csv=',str(stats1.st_size))
print('nc =',str(stats2.st_size))
print('nc/csv=',str(stats2.st_size/stats1.st_size))
结果:
>>> csv = 1688902 bytes
>>> nc = 6432441 bytes
>>> nc/csv = 3.8086526038811015
如您所见,.nc文件大约是.csv文件的4倍。
我发现this post建议从类型'string'更改为'char'类型会大大减少文件大小,但是如何在xarray中执行此操作?
另请注意,即使将所有数据作为整数(即注释df['e'] = df['e'].astype(str)
),生成的.nc文件仍然比.csv大50%
我错过了压缩设置吗? ......还是别的什么?
答案 0 :(得分:2)
我找到了自己问题的答案......
e
,请指定dtype
是"字符" (即S1
)在保存.nc文件之前,请添加以下代码:
encoding = {'a':{'zlib':True},
'b':{'zlib':True},
'c':{'zlib':True},
'd':{'zlib':True},
'e':{'zlib':True, 'dtype':'S1'}}
ds.to_netcdf('ds.nc',format='NETCDF4',engine='netcdf4',encoding=encoding)
新结果是:
>>> csv = 1688902 bytes
>>> nc = 1066182 bytes
>>> nc/csv = 0.6312870729029867
请注意,保存.nc文件仍需要一些时间。
答案 1 :(得分:1)
由于您仅使用0到9之间的变量,因此在CSV文件中,1个字节足以存储数据。 xarray,对于整数,每个默认值使用int64(8个字节)。
要告诉xarray使用1字节整数,您可以使用:
ds.to_netcdf('ds2.nc',encoding = {'a':{'dtype': 'int8'},
'b':{'dtype': 'int8'}, 'c':{'dtype': 'int8'},
'd':{'dtype': 'int8'}, 'e':{'dtype': 'S1'}})
生成的文件是1307618字节。压缩将减少文件大小,尤其是对于非随机数据: - )