Python:循环连接多个 (200+) netCDF 文件以形成一个文件

SHV*_*_la 3 python netcdf pandas python-xarray

我有大量(200 多个)netCDF 文件,这些文件按日期/时间进行索引,并包含单个位置 3 小时的降水测量值,涵盖 20 年,下面显示了一个简短的示例。

                        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
Run Code Online (Sandbox Code Playgroud)

每个文件都包含一个月的数据。我的目标是将所有这些文件连接成一个包含 20 年所有数据的文件。到目前为止,我已经推断出一种可能的前进方式是从每个 netCDF 文件中提取数据并将它们放入一个数据帧中:

import xarray as xr
import pandas as pd

ds = xr.open_dataset('ppt_1_201703.nc')
df = ds.to_dataframe()
Run Code Online (Sandbox Code Playgroud)

如果我有少量文件,使用 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
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?对不起,如果答案很简单(我对 python 很陌生),但我在其他地方找不到任何可以完全解决我的问题的东西。谢谢!

jha*_*man 6

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()
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,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)
Run Code Online (Sandbox Code Playgroud)