我有大量(200+)的netCDF文件,这些文件按日期/时间进行索引,并且包含单个位置(涵盖20年)的3小时每小时降水量测量,下面显示了一个简短示例。
ppt latitude longitude
time
2017-03-01 00:00:00 0.00 16.625 -62.375
2017-03-01 03:00:00 0.00 16.625 -62.375
2017-03-01 06:00:00 0.00 16.625 -62.375
2017-03-01 09:00:00 0.00 16.625 -62.375
2017-03-01 12:00:00 0.00 16.625 -62.375
2017-03-01 15:00:00 0.00 16.625 -62.375
每个文件包含一个月的数据量。我的目标是将所有这些文件合并为一个包含20年所有数据的文件。到目前为止,我已经推断出一种潜在的前进方法是从每个netCDF文件中提取数据并将其放入数据帧中:
import xarray as xr
import pandas as pd
ds = xr.open_dataset('ppt_1_201703.nc')
df = ds.to_dataframe()
如果我的文件数量很少,则使用concat([df,df2,df3])就足够了,我会从每个netCDF文件中手动提取数据。但是,对于这么多的文件,至少可以说这种方法很耗时。
到目前为止,我的想法是相信最好的方法是for循环,该循环根据文件的名称循环遍历每个文件并为每个文件生成一个数据帧。然后,我需要另一个for循环来连接每个数据帧。
我正在努力构建这些循环。文件名是这样的:
ppt_1_199801.nc
ppt_1_199802.nc
ppt_1_199803.nc
...
ppt_1_201610.nc
ppt_1_201611.nc
ppt_1_201612.nc
有什么想法吗?抱歉,如果答案很简单(我是python的新手),但在其他地方找不到任何可以解决我的问题的东西。谢谢!
答案 0 :(得分:4)
Xarray提供了open_mfdataset()
函数,该函数应该为您打开和连接步骤。就您而言,您可以执行以下操作:
import xarray as xr
ds = xr.open_mfdataset('ppt_1_*.nc')
df = ds.to_dataframe()
# or
ds = xr.open_mfdataset([list_of_filenames])
df = ds.to_dataframe()
无论哪种方式,xarray都会为您处理open_mfdataset中的打开和连接步骤。 xarray文档中的更多信息:http://xarray.pydata.org/en/latest/io.html#combining-multiple-files
编辑1:
如果要处理的文件太多(太多的文件无法一次打开),则可以使用autoclose=True
中的open_mfdataset
选项。看起来像:
ds = xr.open_mfdataset('ppt_1_*.nc', autoclose=True)