本文介绍基于Python语言,逐一读取大量.nc格式的多时相栅格文件,导出其中所具有的全部时间信息的方法。

  .ncNetCDF(Network Common Data Form)文件的扩展名,表示一种常用的科学数据存储格式。NetCDF是一种自描述的、可移植的二进制文件格式,用于存储科学和工程领域的大型数据集;由于其自身的特性,.nc数据被广泛应用于气象学、海洋学、地球科学、气候研究、大气科学、地理信息系统等领域。

  首先,明确一下本文的需求。现在有一个文件夹,其中具有大量的.nc格式的栅格文件,如下图所示。

  其中,每一个.nc格式的文件都具有多个时相(或者说是多个维度),而不仅仅只是一个时相。我们希望,读取这个文件夹中的全部.nc格式文件,并获取其所表示的每一个时相。

  明确了需求后,我们就可以开始具体的操作。首先,本文所需用到的代码如下。

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 31 20:28:03 2023 @author: fkxxgis
""" import os
import netCDF4
from netCDF4 import Dataset def list_nc_dates(folder_path):
nc_dates = [] for file_name in os.listdir(folder_path):
if file_name.endswith(".nc"):
file_path = os.path.join(folder_path, file_name)
try:
dataset = Dataset(file_path)
time_var = dataset.variables["time"]
time_values = time_var[:]
time_units = time_var.units
time_calendar = time_var.calendar dates = []
for value in time_values:
date = netCDF4.num2date(value, units=time_units, calendar=time_calendar)
dates.append(date.strftime("%Y-%m-%d %H:%M:%S")) nc_dates.append((file_name, dates))
except Exception as e:
print(f"Error reading file {file_name}: {str(e)}") return nc_dates folder_path = "F:/Data_Reflectance_Rec/soil_1"
nc_dates = list_nc_dates(folder_path) for nc_file, dates in nc_dates:
for date in dates:
print(date)

  这段代码整体思路也很明确。

  首先,我们导入所需的模块。在这里,需要导入Pythonos模块,用于处理文件和文件夹路径操作;同时导入netCDF4库,并接着从netCDF4库中导入Dataset类,用于打开和读取.nc文件。在这里,如果需要配置netCDF4库,大家可以参考文章配置h5py、netCDF4库的方法:Anaconda环境

  接下来,我们定义了一个名为list_nc_dates的函数,接受一个文件夹路径作为参数。在函数中,首先创建一个空列表nc_dates,用于存储每个.nc文件及其对应的日期列表;随后,使用os.listdir()函数遍历文件夹中的所有文件,通过检查文件名是否以.nc结尾来筛选出.nc文件。紧接着,对于筛选出来的.nc文件,使用os.path.join()函数构建其完整路径。

  其次,使用Dataset类打开.nc文件,并将打开的文件对象赋值给dataset变量;随后,获取.nc文件的时间,在本文的.nc数据中,也就是名为time的变量,并将时间变量的值读取到time_values变量中。接下来,分别获取时间变量的单位与时间类型。

  随后,我们创建一个空列表dates,用于存储日期字符串。遍历时间变量的每个值,使用netCDF4.num2date()函数将时间值转换为日期对象。紧接着,将日期对象转换为指定格式的字符串,并将其添加到dates列表中。此外,这里还将.nc文件名和对应的日期列表作为元组添加到nc_dates列表中,方便我们后期对日期的核对。函数的最后,返回包含每个.nc文件及其对应日期的列表。

  在函数外部,我们设置文件夹路径,随后即可调用list_nc_dates函数,将文件夹路径传递给它,并将返回的结果赋值给nc_dates变量。最后,通过循环,打印每个日期即可。

  执行上述代码,即可出现如下图所示的结果(结果很长,就截取一部分)。由于在本文中,每一个.nc格式文件的每一个维度(即每一个时相)都是精确到天的,所以下图天数后的时、分、秒都是00。当然,如果大家的.nc格式文件维度很多,时相打印出来的话也不好完全显示,所以可以考虑将时间信息导出为表格文件等;例如,可以将每一个date都放在DataFrame中,随后导出为.csv文件。

  至此,大功告成。

将NC栅格表示时间维度的数据提取出来的方法的更多相关文章

  1. PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句

    以数据库 msg 为例,说明 PDO 的数据提取.预处理语句: mysql> show tables;+---------------+| Tables_in_msg |+----------- ...

  2. python爬虫数据提取之bs4的使用方法

    Beautiful Soup的使用 1.下载 pip install bs4 pip install lxml # 解析器 官方推荐 2.引用方法 from bs4 import BeautifulS ...

  3. Scrapy(五):Response与Request、数据提取、Selector、Pipeline

    学习自Requests and Responses - Scrapy 2.5.0 documentation Request在Spider中生成,被Downloader执行,之后会得到网页的Respo ...

  4. kmeans算法c语言实现,能对不同维度的数据进行聚类

    最近在苦于思考kmeans算法的MPI并行化,花了两天的时间把该算法看懂和实现了串行版. 聚类问题就是给定一个元素集合V,其中每个元素具有d个可观察属性,使用某种算法将V划分成k个子集,要求每个子集内 ...

  5. 《BI项目笔记》创建时间维度(1)

    SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞 ...

  6. MySQL学习笔记:生成时间维度表

    # ---- 对应时间戳怎么生成的? ---- /*TIME_CD TIME_CD1000000 000005000001 000005000002 000005000003 000005000004 ...

  7. 【BIEE】15_时间维度建立

    时间维度的建立 1.环境准备 ①新建时间维度表:TIME_DIMENSION 建立时间维度表并插入数据 ---------------创建时间维度表 create table TIME_DIMENSI ...

  8. DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension)

    DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★★(5星) 这个时间系列想 ...

  9. 《BI项目笔记》创建时间维度(2)

    创建步骤:   序号 选择的属性 重命名后的名称 属性类别 1 DateKey DateKey 常规 2 Month Key Month Key 月份 3 English Month Name Eng ...

  10. DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)

    跟大家的交流是我的动力. :) DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★ ...

随机推荐

  1. 有没有使用过MindSpore的,体验怎么样啊?

    看到了一个帖子: https://www.zhihu.com/question/386352303/answer/3160948468 ================================ ...

  2. MD5签名生成,字典排序,实际生产

    1.背景 作用:防止请求参数篡改,限制请求时效性: 常用方式:md5签名 关键:签名Key 常用签名原串排列:字母顺序.key1=value1&key2=value2....key (注意:签 ...

  3. 解决input自动填充账号密码时的背景色

      input:-webkit-autofill { box-shadow:0 0 0 1000px white inset !important; } input:-internal-autofil ...

  4. maven3.x上传jar

    由于工作需要,将原有的nexus2.x升级为nexus3.x,升级后创建仓库是非常方便,但是该如何将本地的jar上传到maven仓库呢?这个博主就像无头的苍蝇找了好久,才终于找到解决方案.下面描述下该 ...

  5. .net相关知识点总结

    基础知识 [1]静态构造函数(执行一次,调用静态成员或实例化时执行一次) [2]抽象类和接口的区别 1:抽象类有字段,构造函数,非抽象方法(C#新版本接口可以定义方法体),接口没有 2:抽象类不可多继 ...

  6. Zabbix监控可视化

    一.监控系统的架构体系 大家都知道,监控系统由三大部分组成,一,监控数据采集:二,监控告警分析:三,监控数据报表.可视化.在市面上常见的开源监控软件,或者商业监控软件中,均有很好的实践和体现. 监控系 ...

  7. 计算机二级c语言学习总结

    咱就是说,还有一周多久要进行计算机二级考试了,咱开始在b站上找一些视频进行学习.毕竟咱c语言实战经验自认为是完全足够应付计算机二级了,所以,咱现在的学习目标是先把计算机二级的大概知识过一遍,进行查漏补 ...

  8. STM32的bootloader探究

    OTA OTA(Over-The-Air Technology,空中下载技术)是一种通过无线网络对设备进行远程升级的技术.这种技术最初在PC电脑和移动手机行业中得到应用,近年来在汽车行业中也得到了广泛 ...

  9. 淘宝开放平台api申请,淘宝开放平台api租用,淘宝开放平台api无法申请,淘宝开放平台api暂停接入

    目前淘宝开放平台应用申请是关闭了的,已经无法申请到了,如果你是天猫店铺,可以申请供自己店铺使用的权限,如果你不是天猫店铺或者你是软件开发商,目前是申请不到权限的 如果你必须要用到这个权限包的话,可以联 ...

  10. C#自定义控件—旋转按钮

    C#用户控件之旋转按钮 按钮功能:手自动旋转,标签文本显示.点击二次弹框确认(源码在最后边): [制作方法] 用方法找到控件的中心坐标,画背景外环.内圆:再绘制矩形开关,进行角度旋转即可获得: [关键 ...