首页 > 编程语言 >Python读取NC文件指定经度、纬度与时相的数据

Python读取NC文件指定经度、纬度与时相的数据

时间:2024-03-27 14:37:39浏览次数:38  
标签:纬度 nc 读取 数据 Python 经度 NC need data

Python读取NC文件指定经度、纬度与时相的数据

本文介绍基于Python语言的netCDF4库,读取.nc格式的数据文件,并提取指定维(时间、经度与纬度)下的变量数据的方法。

我们之前介绍过.nc格式的数据,其是NetCDF(Network Common Data Form)文件的扩展名,是一种常用的科学数据存储格式,多用于存储科学和工程领域的大型数据集。同时,在我们之前的文章 Python读取多个NC文件的时间维度信息中,就介绍过基于netCDF4库,对一个文件夹下大量.nc格式数据文件的某一维的信息加以提取的方法。而在本文中,我们则是同样基于netCDF4库,读取.nc文件,并提取指定维(Dimensions,也就相当于是自变量)下的变量(Variables,也就相当于是因变量)的具体数值。

首先,我们需要配置一下netCDF4库,具体配置方法大家可以参考文章 Anaconda配置h5py与netCDF4库。

随后,本文所需代码如下。

# -*- coding: utf-8 -*-
"""
Created on Thu Feb 22 21:41:52 2024

@author: fkxxgis
"""

import netCDF4 as nc

nc_path = r"F:\Data_Reflectance_Rec\soil_1\2020_01.nc"
nc_data = nc.Dataset(nc_path)
print(nc_data)
time_value = nc_data.variables["time"][:]
longitude_value = nc_data.variables["lon"][:]
latitude_value = nc_data.variables["lat"][:]

# 第一种需求
time_need = 0
nc_value_1 = nc_data.variables["swvl1"][time_need, : , : ]

# 第二种需求
longitude_need = 106.467
latitude_need = 36.817
longitude_nc = (abs(longitude_value - longitude_need)).argmin()
latitude_nc = (abs(latitude_value - latitude_need)).argmin()
nc_value_2 = nc_data.variables["swvl1"][time_need, latitude_nc, longitude_nc]

其中,我们首先导入netCDF4库,并指定要读取的.nc格式数据文件的路径nc_path;随后,使用nc.Dataset()打开这一文件,并将返回的Dataset对象存储在nc_data变量中;紧接着,通过print()打印nc_data,这将显示要读取的.nc格式数据文件的基本信息,如变量、维、属性等——这里具体打印出来的情况如下图所示。

Python读取NC文件指定经度、纬度与时相的数据_.nc格式文件

其中,在上图我们需要重点关注紫色框内的内容。首先,在dimensions中,我们可以看到所有的维;我这里的.nc格式数据是一个表示气象的数据,所以文件中的维依次就是时间、纬度与经度;随后,在variables中,我们可以看到所有的数据变量(这里的数据变量是包含了维、变量与其他参数)——其中我们重点观察数据中的因变量(也就是上图中的swvl1),需要留意一下其后不同维的排序顺序,在后面我们按照维提取变量数据的时候会用到。

回到前述代码的介绍中。通过前面print()打印出来的nc_data信息,我们知道了这个.nc数据的维,此时我们可以将这几个维也打印出来看看。例如,time_value = nc_data.variables["time"][:]就表示将时间这个维打印出来,相当于获取了全部的时间节点。

再接下来,我们即可开始按照维来提取变量。为了方便,我们就以这个.nc文件的时间维中的第一个节点对应的数据(也就是第一景数据)为例来介绍;因此,我们先将time_need设置为0,表示读取第一个时间节点的数据。在这里,我们给出了2种按照维来提取变量的需求。

首先,是第一种需求,也就是time_need = 0这一行代码的下一行。nc_data.variables["swvl1"]表示这个.nc文件中读取名为swvl1的变量的值,而后面的[time_need, :, :]表示选择指定时间维下的所有经度和纬度位置的值。这些值将被存储在nc_value_1变量中,也就是说这个nc_value_1变量相当于就是当前这个.nc文件的第一景数据(时间节点排在第一位的数据)。

其次,是第二种需求。前面我们提取了指定时间维下的所有经度和纬度位置的值,那么现在就更进一步,提取指定时间维度、经度维度以及纬度维度的数据(相当于就是从前面的一景数据变成了一个像元的数据)。首先,我们指定一个处于.nc文件成像范围内的目标经度longitude_need和目标纬度latitude_need,并使用argmin()函数找到目标经、纬度值与文件中经度、纬度的维数据值最接近的索引值——即longitude_nc和latitude_nc。最后,即可使用nc_data.variables["swvl1"][time_need, latitude_nc, longitude_nc]来获取特定时间、经度和纬度位置的值,并将结果存储在nc_value_2变量中。

这里提一句——为什么需要用argmin()函数呢?这个是因为,我们在实际情况中,需要提取指定空间位置的像素时,这个位置的经、纬度数据肯定是随机的;而通过argmin()函数,就可以找到.nc文件里面经度、纬度所对应的维中,与我们实际需要的经、纬度最接近的那个数值所对应的维的下标。例如,上述代码中,我们希望提取实际经度为106.467位置处的数据;而我这里这个.nc文件,其维中的经度的分辨率是0.1,那它自然没有办法非常精确地确定106.467的位置;所以需要通过argmin()函数,找到与106.467最接近的数据106.5,并进一步确定出这个106.5所在的经度维的下标,那么就可以提取出指定的变量了。

如下图所示,我们通过上述第二种需求,提取出来了目标时间、经度与纬度维下的一个像素。

Python读取NC文件指定经度、纬度与时相的数据_栅格文件_02

那么这个像素值对不对呢?我们可以在ArcGIS中打开这个.nc文件的第一景数据,找到代码中目标经、纬度(也就是longitude_need和latitude_need所指向的数据)所对应的像元,并查看其像素值;如下图所示。

Python读取NC文件指定经度、纬度与时相的数据_NC数据_03

可以看到,上图在ArcGIS提取出来的像素值,与上上图在Python中提取出来的像素值一致,说明我们的代码无误。

至此,大功告成。配置netCDF4库如果失败可以用过西部世界加速器加速

标签:纬度,nc,读取,数据,Python,经度,NC,need,data
From: https://www.cnblogs.com/xbsjwestworld/p/18099075

相关文章

  • Python程序设计 循环结构
    1.达依尔的麦子数相传古印度宰相达依尔,是国际象棋的发明者。有一次,国王因为他的贡献要奖励他,问他想要什么.达依尔说:”只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:第一格一粒,第二格两粒,……,后面一格的麦子总是前一格一麦子数的两倍,摆满整个棋盘,我就感恩不尽了。......
  • python 列表基本操作
    python列表基本操作一、列表基本操作1.列表2.访问列表中的值3.更新列表4.删除列表元素5.Python列表脚本操作符6.Python列表截取与拼接7.嵌套列表8.列表比较9.Python列表函数&方法二、代码概述一、列表基本操作1.列表序列是Python中最基本的数据结构......
  • opencv开发环境搭建window
    1.python安装官网地址https://www.python.org/根据需求下载最新或者指定版本,下载完成后双击exe进行安装。安装完成后,需要环境变量->系统变量->Path 新增,把Python安装的填入。这样可以在cmd下直接使用Python。  2.安装 numpymatplotlibopencv-python python-m......
  • 【数据库】如何利用Python中的petl将PostgreSQL中所有表的外键删除,迁移数据,再重建外键
    一、简介在数据库管理中,外键是一种重要的约束,用于确保数据的一致性和完整性。然而,在某些情况下,我们可能需要删除或修改外键。本文将介绍如何使用Python中的petl库将PostgreSQL中所有表的外键删除,迁移数据,并重新建立外键。二、安装petl和psycopg2首先,我们需要安装petl和psycopg2......
  • Authentication failed. Some common reasons include:
    问题无论是pull、clone还是push都报错fatal:Outofmemory,mallocfailed(triedtoallocate301989888bytes)fatal:Couldnotreadfromremoterepository.Pleasemakesureyouhavethecorrectaccessrightsandtherepositoryexists.解决方法gitconfig--globalh......
  • [转帖]SPECjbb MultiJVM - Java Performance
     MovingonfromSPECCPU,weshiftovertoSPECjbb2015.SPECjbbisafromground-updevelopedbenchmarkthataimstocoverbothJavaperformanceandserver-likeworkloads,fromtheSPECwebsite:“TheSPECjbb2015benchmarkisbasedontheusagemodelofa......
  • python变量
    python语法【1】注释语法便于开发人员了解代码含义如何添加注释单行注释:只对本行注释#注释多行注释:适用于代码块'''注释'''快捷键:ctrl/代码注释原则:只给特定的代码位置添加必要的注释可以英文,可以中文【2】变量和常量都是用来表示事物或......
  • Electron Mac 打包报 Error: Exit code: ENOENT. spawn /usr/bin/python ENOENT 解决
    ElectronMac打包报Error:Exitcode:ENOENT.spawn/usr/bin/pythonENOENT解决方法最近在开发的时候,发现打包Electron项目报错,错误的信息为Error:Exitcode:ENOENT.spawn/usr/bin/pythonENOENT报错原因是因为Mac升级到macOSventuraversion13.0.1后系统移除了......
  • 【OpenCV】OpenCV (C++) 与 OpenCvSharp (C#) 之间数据通信
     OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多......
  • 用python创建一个简单的GUI程序,python小案例
    importtkinter这一行导入了tkinter库,这是Python中用于创建图形用户界面(GUI)的标准库之一importtkinterastk这一行同样导入了tkinter库,但是使用了as关键字给它起了一个别名tk,这样在代码中就可以使用tk来代替tkinter了,使代码更简洁。window=tk.Tk()创建一个Tkint......