通过 Python 在 NetCDF 中减去,平均,挤压,然后子集变量

问题描述

我有一个 NetCDF,它以每日值格式在美国拥有多条污染数据。我希望从另一个('PM25')中减去一个背景变量('nosmoke background PM25'),然后平均这个结果来创建一个年度值。据我了解,通过创建年度值,我将数组从三个维度(时间、纬度、经度)更改为两个维度(纬度、经度),因为现在没有日值。然后我希望对这个变量进行子集化以只包含一个感兴趣的区域。下面是我的代码。非常感谢任何帮助。

import netCDF4 as nc
import numpy as np
 
fn = '24hr_SmokePM25_2018.nc'
ds = nc.Dataset(fn)

#All data defining total PM25
TOT_PM25 = ds.variables['PM25']
NS_BKGD_PM25 = ds.variables['nosmoke background PM25']

#create empty array that is same size as TOT_PM25 variable to fill
Smoke_PM25 = np.full_like(TOT_PM25,0)

#For loop in subtracting total PM25 from no smoke PM25
for i in range (1,365):
    Smoke2_PM25[i,:,:]=TOT_PM25[i,:]-NS_BKGD_PM25[i,:]

#Averaging and squeezing daily value
np.mean(Smoke2_PM25[i,:])
np.squeeze(Smoke2_PM25,axis=0)

#boundary input for desired region to pull
latbounds = [ 24,39 ]
lonbounds = [ -96,-77 ]
lons = ds.variables['lon'][:]
lats = ds.variables['lat'][:]

# latitude lower and upper index
latli = np.argmin( np.abs( lats - latbounds[0] ) )
latui = np.argmin( np.abs( lats - latbounds[1] ) ) 

# longitude lower and upper index
lonli = np.argmin( np.abs( lons - lonbounds[0] ) )
lonui = np.argmin( np.abs( lons - lonbounds[1] ) )  

# Value subsets (SmokeP25,latitude,longitude) 
Smoke_Region_PM25 = ds.variables['PM25'][ :,latli:latui,lonli:lonui ] 

#Close the NetCDF
ds.close()

解决方法

您可以使用我的 nctoolkit 包 (https://pypi.org/project/nctoolkit/) 的 v0.3.0 轻松完成此操作。

先读入数据:

import nctoolkit as nc
fn = '24hr_SmokePM25_2018.nc'
data = nc.open_data(fn)

然后从另一个变量中减去一个变量以创建新变量:

data.assign(new = lambda x: x.PM25 - x.nosmoke_background_PM25)

完成后,您可以计算年平均值:

data.tmean("year")

然后可视化结果:

data.plot("new")