Python netcdf_python处理nc文件

Python netcdf_python处理nc文件  NetCDF(networkCommonDataForm)网络通用数据格式是一种面向数组型并适于网络共享的数据的描述和编码标准。目前,NetCDF广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。用户可以借助多种方式方便地管理和操作NetCDF数据集。  文件的后缀是.nc  这里采用python的一个专门用来处理.nc文件的库–netCDF4该库的安装直接:pipinstallnetCDF4这个库玩起来稍微比Pandas复杂一些。下面以全球降水量数据为例进行

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

  NetCDF(network Common Data Form)网络通用数据格式是一种面向数组型并适于网络共享的数据的描述和编码标准。目前,NetCDF广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。用户可以借助多种方式方便地管理和操作 NetCDF 数据集。
  文件的后缀是.nc
  这里采用python的一个专门用来处理.nc文件的库–netCDF4
该库的安装直接:

pip install netCDF4

这个库玩起来稍微比Pandas复杂一些。

下面以全球降水量数据为例进行举例:

首先导入相关库:

import numpy as np
import pandas as pd
import netCDF4 as nc
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置

Jetbrains全家桶1年46,售后保障稳定

导入(.nc文件)数据集:

nf = nc.Dataset(r'precip.mon.total.1x1.v2018.nc','r')

直接输出查看nf会比较杂,先直接看下有什么变量:

nf.variables.keys()

输出:
dict_keys([‘lat’, ‘lon’, ‘time’, ‘precip’])

  可见这个数据集无非4项数据:纬度,经度,时间,降水量
  我们先来查看下这些数据项长啥样:

#查看一下time的属性
nf.variables['time']

输出:
<class ‘netCDF4._netCDF4.Variable’>
float64 time(time)
long_name: Time
units: days since 1800-1-1 00:00:00
delta_t: 0000-01-00 00:00:00
avg_period: 0000-01-00 00:00:00
standard_name: time
axis: T
coordinate_defines: start
actual_range: [33237. 79227.]
unlimited dimensions: time
current shape = (1512,)
filling on, default _FillValue of 9.969209968386869e+36 used

。。。看的一脸懵,莫慌。这其实是这些数据项的属性值
  从units可以看出:是以从1800-1-1 00:00:00的天数累记储存的。
输出看看:

#查看一下time的数据
nf.variables['time'][:]

输出:
masked_array(data=[33237., 33268., 33296., …, 79166., 79197., 79227.],
mask=False,
fill_value=1e+20)

  所以我们要想得到日期,那就得xxxx/365+1800为年份,太麻烦了。。莫慌
有个简便方法:

#将time转换成时间格式,因为看上面time的属性可以知道:units: days since 1800-1-1 00:00:00
#是以从1800-1-1 00:00:00的天数累记储存的。
#用.data直接把masked_array中的data数据读出。
time = nc.num2date(nf.variables['time'][:],'days since 1800-1-1 00:00:00').data

输出:
array([cftime.DatetimeGregorian(1891, 1, 1, 0, 0, 0, 0),
cftime.DatetimeGregorian(1891, 2, 1, 0, 0, 0, 0),
cftime.DatetimeGregorian(1891, 3, 1, 0, 0, 0, 0), …,
cftime.DatetimeGregorian(2016, 10, 1, 0, 0, 0, 0),
cftime.DatetimeGregorian(2016, 11, 1, 0, 0, 0, 0),
cftime.DatetimeGregorian(2016, 12, 1, 0, 0, 0, 0)], dtype=object)

  真舒服变好看了,通过time[0].year我们是可以读取出第一个元素的年份信息。

把剩下的数据读出:

lats = nf.variables['lat'][:].data
lons = nf.variables['lon'][:].data

  那么这里我们假设要取出2016年的降水量数据:如何操作??
先来看看降水量数据的属性信息:

nf.variables['precip']

<class ‘netCDF4._netCDF4.Variable’>
float32 precip(time, lat, lon)
long_name: GPCC Monthly total of precipitation
missing_value: -9.96921e+36
statistic: Total
valid_range: [ 0. 8000.]
parent_stat: Observations
var_desc: Precipitation
units: mm
level: Surface
actual_range: [ 0. 3349.61]
dataset: GPCC Precipitation 1.0degree V2018 Full Reanalysis
unlimited dimensions: time
current shape = (1512, 180, 360)
filling on, default _FillValue of 9.969209968386869e+36 used

从中看到:
float32 precip(time, lat, lon):
可知:这个降水量数据是有3个维度的,分别是:时间,纬度,经度
所以可知纬度上的维度大小肯定是180,经度上的维度大小肯定是360嘿嘿。。
missing_value:-9.96921e+36:
说明元素值为:-9.96921e+36的为缺失值,预处理的时候要注意了。
units: mm:
说明降水量单位为mm

筛选数据:
  没有pandas那么舒服,他是将2016年数据的索引找出来,然后再根据索引获取2016年的数据的。

#筛选2016年的全球降水量数据,一共12个月的
import dateutil.parser  #引入这个库来将日期字符串转成统一的datatime时间格式
all_times = nf.variables['time']
sdt = dateutil.parser.parse("2016-1-1T00:00:00")
edt = dateutil.parser.parse("2016-12-1T00:00:00")
st_idx = nc.date2index(sdt, all_times)
et_idx = nc.date2index(edt, all_times)
precip = nf.variables['precip'][st_idx:et_idx+1,:].data

再来简单处理一下缺失值吧,o(︶︿︶)o让缺失值为0 :

#缺失值处理:-9.96921e+36为缺失值
precip[precip==-9.96921e+36]=0

看看维度信息:
  确实纬度180,经度360,没错。学过地理的都知道咯。(^U^) ,然后12指2016年的12个月的数据

precip.shape   #(12, 180, 360)

下面就是用matplotlib的basemap的地图库可视化咯:
  懂得都懂,这里就不介绍这个画图库了,网上很多参考资料。
  这里将2016年的12个月的数据可视化并保存:

# 经纬度平均值
lon_0 = lons.mean()
lat_0 = lats.mean()
m = Basemap(lat_0=lat_0, lon_0=lon_0)
lon, lat = np.meshgrid(lons, lats)
xi, yi = m(lon, lat)
# 绘制经纬线
m.drawparallels(np.arange(-90., 91., 20.), labels=[1,0,0,0], fontsize=10)
m.drawmeridians(np.arange(-180., 181., 40.), labels=[0,0,0,1], fontsize=10)
# Add Coastlines, States, and Country Boundaries
m.drawcoastlines()
m.drawstates()
m.drawcountries()

for i in range(12):
    # Plot Data
    # 这里我的precip数据是24小时的,我这里只绘制第1小时的(precip_0)
    precip_0 = precip[i:i+1:, ::, ::]
    cs = m.pcolor(xi, yi, np.squeeze(precip_0))
    if i==0:
        
        # Add Colorbar
        cbar = m.colorbar(cs, location='right', pad="10%")
        cbar.set_label(nf.variables['precip'].units)
        # Add Title
    plt.title('2016年'+str(i+1)+'月'+'全球降水量分布')    
    plt.savefig(str(i)+'.jpg',dpi=400)

  随便来一张效果(大家可以自己调调颜色还有刻度那些,调的好看一点,我这个有点丑,而且这份数据集缺失值较多好像,所以整体效果不漂亮):
在这里插入图片描述
  如果你还想来点骚操作,让12个月的图呈现动态变化,那就用imageio库将其转成GIF图即可:

import imageio
frames = []  
for i in range(12):  
    frames.append(imageio.imread(str(i)+'.jpg'))  
# Save them as frames into a gif 
imageio.mimsave('动图.gif', frames, 'GIF', duration = 0.8) 

数据:

  1. GPCC数据集下载网址(下载可能需要科学上网),该网站里有很多别的数据可下载:
    https://psl.noaa.gov/data/gridded/data.gpcc.html
    本文所用数据集(以上传到百度网盘):
    链接:https://pan.baidu.com/s/1kNrNTtI9jqTHlOhGukShYA
    提取码:zz5c
    复制这段内容后打开百度网盘手机App,操作更方便哦

接触这个库时参考过的链接:

  1. Python读取气象数据nc格式文件的入门级操作:
    https://www.kesci.com/mw/project/5f1a407194d484002d2d9b2b/content

  2. 气象数据处理——nc文件:
    https://zhuanlan.zhihu.com/p/129351199?from_voters_page=true

  3. Python对气象数据的可视化
    https://zhuanlan.zhihu.com/p/260514949

  4. 使用Python的netCDF4和matplotlib.basemap包进行气象数据的可视化
    https://theonegis.blog.csdn.net/article/details/50805408

  5. python利用netCDF4处理气象数据(nc文件)
    https://www.pianshen.com/article/42521104083/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200847.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android之使用weight属性实现控件的按比例分配空间

    从今天开始,把看书时候的知识点整理成博客,这个比较简单,估计有经验的都用过,weight属性 在做Android布局的时候,经常遇到需要几个控件按比例分配空间的情况比如下图效果在底部设置两个button,占据底部宽度一部分的同时,保持1:3的比例,当然了,这么难看的布局用处不大,仅是用来说明weight的用法布局代码如下:

    2022年3月11日
    43
  • 【Java入门练习100例】07.各数字的和——取余运算

    【Java入门练习100例】07.各数字的和——取余运算除法运算取余运算

    2022年5月1日
    58
  • Root apk 2021_proguard混淆jar包

    Root apk 2021_proguard混淆jar包backdoor-apk从名字上我们就能知道它的用途了,没错就是用来制作APK后门的。这款工具使用起来非常方便,而且功能也很强大!话不多说,下面我们直接进入正题。首先,让我们对它进行安装,在安装前我们需要先安装它的一些依赖lib库文件:apt-getinstalllib32stdc++6lib32ncurses5lib32z1这里询问我们,对这些安装的服务,当他们更新时不再进行询…

    2022年8月20日
    5
  • 基于stm32和ov7725的智能循迹车

    基于stm32和ov7725的智能循迹车基于stm32f103zet6的智能循迹车。1.L298nIN1IN2控制一个轮子,IN3IN4控制另外一个。这里使用的是直流电机,控制如下:为了使用pwm进行调速,一定要记得用跳帽使调速度端为高电平。这样,输入不同占空比的pwm波就可以实现调速了。2.连接方式连接时一定要注意的一点就是一定要保证l298n与单片机共地,否则会出现控制端有输入但输出端无输出导致车不移动的…

    2022年9月23日
    0
  • 给出前序遍历和中序遍历求二叉树_已知前序遍历和后序遍历

    给出前序遍历和中序遍历求二叉树_已知前序遍历和后序遍历一、基本概念1.先序遍历(NLR)可以确定二叉树的父子结点;2.中序遍历(LNR)可以确定二叉树的左右子树;3.后序遍历(LRN)可以确定二叉树的父子结点;二、结论1.已知先序遍历,中序遍历序列,能够创建出一棵唯一的二叉树,可以得出二叉树的后序遍历;2.已知后序遍历,中序遍历序列,能够创建出一棵唯一的二叉树,进而可以得出二叉树的先序序列;3.综上,必须含有中序遍历(确定…

    2022年9月10日
    0
  • ducter运维平台_开源自动运维管理平台_自动化运维平台 开源「建议收藏」

    ducter运维平台_开源自动运维管理平台_自动化运维平台 开源「建议收藏」专访运维管理开源平台负责人刁文波:Ducter能550×364-47KB-JPEG专访运维管理开源平台负责人刁文波:Ducter能550×381-45KB-JPEG光宇游戏黄振:开源运维自动化平台架构实现与846×474-35KB-JPEGCheungSSH国产自动化运维工具开源Web界面811×525-89KB-PNGCheungSSH国产自动化运维工具开源Web…

    2022年5月17日
    73

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号