【Python学习】——技巧分享(持续更新中)

Xarray使用技巧

1. nc数据快速转换为dataframe形式

import xarray as xr
ds = xr.open_dataset("/mnt/e/Research_life/DATA/GLEAM/Ep_1980-2020_GLEAM_v3.5a_MO.nc")['Ep']
ds = ds.transpose('time','lat','lon')
ds[0,::].plot()
# transfer to dataframe
df = ds[0,::].to_dataframe().reset_index()
df

 2. nc数据快速画图后存在旋转90度问题
接上文,只需要对调经纬度即可

import xarray as xr
ds = xr.open_dataset("/mnt/e/Research_life/DATA/GLEAM/Ep_1980-2020_GLEAM_v3.5a_MO.nc")['Ep']
ds = ds.transpose('time','lat','lon')
ds[0,::].plot()

 3. nc数据经度范围从0-360转至-180-180

import xarray as xr
Pre = xr.open_dataset("/mnt/e/Research_life/DATA/Precipitation/precip.mon.total.v2018.nc").precip
Pre['lon'] = (Pre['lon'] + 180) % 360 - 180  # original data ranges from 0 to 360
Pre.sortby(Pre.lon)

 4. nc数据指定数值范围变为某固定值

import xarray as xr
grace = xr.open_dataset("/mnt/e/Research_life/DATA/GRACE-mascon/deseasonal.nc").trend.loc[:'2015',:,:].resample(time='1M').mean(skipna=False)
# 6 levels
condlist = [(grace.values<=-1.6),(grace.values>-1.6)&(grace.values<=-1.3),(grace.values>-1.3)&(grace.values<=-.8),
            (grace.values>-.8)&(grace.values<=-.5),(grace.values>-.5)&(grace.values<=.5),(grace.values>.5)]
choicelist = [-4,-3,-2,-1,0,1] # 对应的赋值列表
y = np.select(condlist, choicelist)
grace[:] = y # 将 y 的数据赋值给 x 变量

 5. nc数据时间聚合(例如月值变为年值)

import xarray as xr
ds = xr.open_dataset("/mnt/e/Research_life/DATA/NDVI/NDVI_mvc_1982_2015_china.nc")
data = ds.NDVI_mvc.resample(time='1Y').mean(skipna=False)

 6. nc数据屏蔽多年均值低于某阈值地区(本例以屏蔽NDVI多年平均值小于0.1的地区为例)

说明:data为三维数据(时间、纬度、经度),mask只是一个二维数组,需先变为三维后再进行屏蔽

## 屏蔽NDVI多年平均值小于0.1的地区
# 计算var的多年平均值,沿着time轴求平均
var_mean = np.nanmean(data, axis=0) # var_mean是一个二维数组,形状为(lat, lon)
# 找出var_mean小于0.01的地区,返回一个布尔数组
mask = np.where(var_mean < 0.1, True, False) # mask是一个二维数组,形状为(lat, lon),其中True表示小于0.1的地区,False表示大于等于0.1的地区
# 将mask应用到var上,创建一个掩膜数组
mask_3d = np.repeat(mask[np.newaxis, :, :], len(data['time']), axis=0)
var_masked = np.ma.array(data, mask=mask_3d) # var_masked是一个三维掩膜数组,形状为(time, lat, lon),其中被mask覆盖的元素被屏蔽掉

 7. (接6)把三维数组转变为nc数据

## var_masked 写入nc数据
# 创建一个空字典
nc_dict = {}
# 将time, lat, lon, var_masked添加到字典中
nc_dict['time'] = {'dims': ('time',), 'data': data.time.values}
nc_dict['lat'] = {'dims': ('lat',), 'data': data.lat.values}
nc_dict['lon'] = {'dims': ('lon',), 'data': data.lon.values}
nc_dict['NDVI_mvc'] = {'dims': ('time', 'lat', 'lon'), 'data': var_masked}
# 使用`from_dict`,将字典转化为xr.Dataset对象
data = xr.Dataset.from_dict(nc_dict)

 8. nc数据删选出指定时间范围(非连续时间)数据

        case one:grace数据中有缺失值,其他数据按照grace数据时间对齐

grace = xr.open_dataset("/mnt/e/Research_life/DATA/GRACE-mascon/deseasonal.nc").trend.loc[:'2015',:,:].resample(time='1M').mean(skipna=False)
time_range = grace.time
grace = grace.loc[grace.time.dt.strftime('%Y-%m').isin(time_range.dt.strftime('%Y-%m')),:,:]

## import landcover data 
LC = xr.open_dataarray("/mnt/e/Research_life/DATA/Land cover/MODIS LAND_USE-0.05-QuanQiu/LC.nc")
LC = LC.loc[LC.time.dt.strftime('%Y-%m').isin(time_range.dt.strftime('%Y-%m')),:,:]

空间图使用技巧

 1. 空间图自定义colorbar进行绘图

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as mcolors
colors = ['#9f0028', '#eb3c39', '#ff7f64', '#fea68e','#ffccc8',
          '#84d88a',
          '#86b4f0', '#6c88f3', '#0065d7', '#0051d6','#0037a8']
cmap = mcolors.ListedColormap(colors)
def show_cmap(cmap, norm=None, extend=None):
    '''展示一个colormap.'''
    if norm is None:
        norm = mcolors.Normalize(vmin=0, vmax=cmap.N)
    im = cm.ScalarMappable(norm=norm, cmap=cmap)

    fig, ax = plt.subplots(figsize=(6, 1))
    fig.subplots_adjust(bottom=0.5)
    fig.colorbar(im, cax=ax, orientation='horizontal', extend=extend)
    plt.show()
show_cmap(cmap)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值