使用 xarray 将单个每月 NetCDF 文件拆分为每日平均 NetCDF 多个文件

Split single monthly NetCDF file into daily averaged NetCDF multiple files using xarray

我有 1 个 2007 年 9 月的 NetCDF 文件。它包含某些 lat/long 风和湿度变量的 6 小时数据。每个变量的形状是(120, 45, 93):120次(每天4次),45个纬度和93个经度。使用以下代码,我可以获得所有变量的每日平均数据。现在,每个变量的形状都是 (30, 45, 93)。时间为整数,单位为'hours since 1900-01-01 00:00:00.0'.

如何从这个日平均数据中拆分成每天 30 个不同的 NetCDF 文件,文件名包含 YYYY:MM:DD 时间格式?

import xarray as xr
monthly_data = xr.open_dataset('interim_2007-09-01to2007-09-31.nc') 
daily_data = monthly_data.resample(time='1D').mean()

阅读文档后,您可以使用 NetCDF4 的 num2date 将整数转换为日期。 你也可以索引 xarray.dataset 使用 isel():

from netCDF4 import num2date
for i in range(30):
    day = daily_data.isel(time=i)
    the_date = num2date(day.time.data, units='hours since 1900-01-01 00:00:00')
    day.to_netcdf(str(the_date.date())+'.nc', format='NETCDF4')

Xarray 在这种情况下具有顶级功能 - xarray.save_mfdataset。在您的情况下,您可能希望使用 groupby 将数据集分成逻辑块,然后创建相应文件名的列表。从那里开始,让 save_mfdataset 完成剩下的工作。

dates, datasets = zip(*ds.resample(time='1D').mean('time').groupby('time'))
filenames = [pd.to_datetime(date).strftime('%Y.%m.%d') + '.nc' for date in dates]
xr.save_mfdataset(datasets, filenames)

为了以防对任何人有帮助,也可以直接从命令行执行计算日均值并划分为单独的日文件的任务:

cdo splitday -daymean in.nc day

生成一系列文件 day01.nc day02.nc ...