Python: 循环连接多个 (200+) netCDF 文件以形成一个文件
Python: loop to concatenate multiple (200+) netCDF files to form one file
我有大量 (200+) netCDF 文件,这些文件由 date/time 索引,包含单个位置的 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
每个文件都包含一个月的数据。我的目标是将所有这些文件连接成一个包含 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 的新手),但我在别处找不到任何能完全解决我的问题的东西。谢谢!
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:
如果您要处理许多文件(太多而无法一次打开),您可以使用 open_mfdataset
中的 autoclose=True
选项。看起来像:
ds = xr.open_mfdataset('ppt_1_*.nc', autoclose=True)
我有大量 (200+) netCDF 文件,这些文件由 date/time 索引,包含单个位置的 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
每个文件都包含一个月的数据。我的目标是将所有这些文件连接成一个包含 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 的新手),但我在别处找不到任何能完全解决我的问题的东西。谢谢!
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:
如果您要处理许多文件(太多而无法一次打开),您可以使用 open_mfdataset
中的 autoclose=True
选项。看起来像:
ds = xr.open_mfdataset('ppt_1_*.nc', autoclose=True)