Python | 处理海洋2C 数据 | 非标准时间格式

news2024/9/25 7:18:54

写在前面

最近,师弟在用Python读取某海洋2C数据时,突然冒出一个报错:“时间单位的参考日期无效,当前日期 00:00:00.0”。这让我回想起,似乎在很久很久以前,我处理SMAP和Argo数据时也遇到过类似的问题。为了不让未来的师弟师妹们再次被这种问题困扰,我决定在这里记录一下这个坑。

希望未来再看到这条记录时,能少叹气、多微笑,毕竟已经知道怎么解决了嘛!

问题复现

在正常使用xarray读取nc文件时,会出现以下报错:

import xarray as xr
path= r'I:/H2C_*.nc'
ds  = xr.open_dataset(path)
ValueError: invalid reference date for time units: current day 00:00:00.0

ValueError: unable to decode time units 'secs since current day 00:00:00.0' with 'the default calendar'. 

Try opening your dataset with decode_times=False or installing cftime if it is not installed.`

遇到问题就解决问题嘛,上面的报错信息给的也挺详细,包括解决方法,说让你在打开dataset的时候可以加上’decode_times=False’.试试加上确实可以成功打开了

ds  = xr.open_dataset(path,decode_times=False)

此外,我发现可以直接实现netCDF4进行打开,就不会有上面的错误提示。

import netCDF4 as nc
ds  = nc.Dataset(path)

好了,这是遇到的第一个问题,文件打开时出现的错误。

下面是第二个问题:时间转换异常。

下面我希望将数据的时间转化为datetime的格式,方面后续的处理。运行下面的代码进行转换

path= r'I:/H2C_*.nc'
ds  = xr.open_dataset(path,decode_times=False)
time = ds['time'].values
time_c = pd.to_datetime(time)

虽然代码没有报错,但是他的转换结果是有问题的,因为我已知读取的这个文件时间应该是在2021年。所以这是什么原因导致的转换的时间出现异常呢?

问题解释

在一般的netcdf文件中,对于该文件的时间,会给定一个参考的时间标准,然后从标准进行计算,得到相应的时间序列。

在测绘里面有点类似于85国家高程基准的概念。

怎么找到这个时间从参考日期呢,可以直接在time的变量的属性信息里面找到(一般来说都会写在里面,没写的除非特殊说明)

ds.time
Out[139]: 
<xarray.DataArray 'time' (time: 2355)> Size: 19kB
array([6.818707e+08, 6.818707e+08, 6.818707e+08, ..., 6.818738e+08,
       6.818738e+08, 6.818738e+08])
Coordinates:
  * time     (time) float64 19kB 6.819e+08 6.819e+08 ... 6.819e+08 6.819e+08
    lat      (time) float64 19kB ...
    lon      (time) float64 19kB ...
Attributes:
    long_name:           time (sec since 2000-01-01)
    standard_name:       time
    calendar:            gregorian
    tai_utc_difference:  -37.0
    leap_second:         0000-00-00 00:00:00
    units:               seconds since 2000-01-01 00:00:00.0
    comment:             [tai_utc_difference] is the difference between TAI a...

Attributes-units可以发现,其参考时间为’seconds since 2000-01-01 00:00:00.0’.下面就可以将这个作为基准时间,然后将原本的时间进行转换,主要使用netCDF4.num2date()函数

path= r'I:/H2C_*.nc'
ds  = xr.open_dataset(path,decode_times=False)
time = ds['time']
time_array = nc.num2date(time,units='sec since 2000-01-01',calendar=time.calendar)
time_array

转换后时间就正常了:

time_array
Out[150]: 
array([cftime.DatetimeGregorian(2021, 8, 10, 0, 31, 55, 472829, has_year_zero=False),
       cftime.DatetimeGregorian(2021, 8, 10, 0, 31, 56, 727732, has_year_zero=False),
       cftime.DatetimeGregorian(2021, 8, 10, 0, 31, 57, 477053, has_year_zero=False),
       ...,
       cftime.DatetimeGregorian(2021, 8, 10, 1, 23, 57, 42110, has_year_zero=False),
       cftime.DatetimeGregorian(2021, 8, 10, 1, 23, 58, 42587, has_year_zero=False),
       cftime.DatetimeGregorian(2021, 8, 10, 1, 23, 59, 43059, has_year_zero=False)],
      dtype=object)

然后再用pandas.to_datetime()进行相应转换

datetime_array = np.array([datetime.datetime(t.year, t.month, t.day, t.hour, t.minute, t.second, t.microsecond) for t in time_array])
time_convert = pd.to_datetime(datetime_array)
time_convert
Out[154]: 
              ['2021-08-10 00:31:55.472829', '2021-08-10 00:31:56.727732',
               '2021-08-10 00:31:57.477053', '2021-08-10 00:31:59.762333',
               '2021-08-10 00:32:06.855991', '2021-08-10 00:32:07.055824',
               '2021-08-10 00:32:10.808600', '2021-08-10 00:32:11.058392',
               '2021-08-10 00:32:12.207441', '2021-08-10 00:32:15.635650',
               ...
               '2021-08-10 01:23:32.429303', '2021-08-10 01:23:33.429862',
               '2021-08-10 01:23:45.886553', '2021-08-10 01:23:46.086657',
               '2021-08-10 01:23:47.937610', '2021-08-10 01:23:55.791510',
               '2021-08-10 01:23:56.041632', '2021-08-10 01:23:57.042110',
               '2021-08-10 01:23:58.042587', '2021-08-10 01:23:59.043059'],
              dtype='datetime64[ns]', length=2355, freq=None)

可以将上述步骤封装为一个函数,方便对于多个文件进行批量处理:

import xarray as xr
import netCDF4 as nc
import numpy as np
import pandas as pd
import datetime
def convert_nc_time_to_datetime(path):
    """
    将NetCDF文件中的时间变量转换为pandas的Datetime对象。

    参数:
        path (str): NetCDF文件的路径。

    返回:
        pd.DatetimeIndex: 转换后的时间数组。
    """
    # 打开NetCDF文件并读取时间变量
    ds = xr.open_dataset(path, decode_times=False)
    time = ds['time']
    
    # 将时间变量转换为datetime对象数组
    time_array = nc.num2date(time, units=time.units, calendar=time.calendar)
    
    # 将datetime对象数组转换为np.datetime64对象
    datetime_array = np.array([datetime.datetime(t.year, t.month, t.day, t.hour, t.minute, t.second, t.microsecond) for t in time_array])
    
    # 将datetime对象数组转换为pandas的DatetimeIndex
    time_convert = pd.to_datetime(datetime_array)
    
    return time_convert
# 使用示例
path = r'I:/H2C_*.nc'
time_convert = convert_nc_time_to_datetime(path)
print(time_convert)

其他场景应用

了解了nc.num2date这个函数后,可以干什么呢?对于两组数据的units不一致时,如果你要将两组数据进行误差比较,就可以用到这个函数,比如我现在有一组SMAP盐度卫星数据以及一组Argo盐度数据,希望将两组数据进行时间匹配以及误差比较。就可以利用这个函数,将Argo的时间标准('days since 1950-01-01 00:00:00')转换为SMAP的时间标准('seconds since 2000-1-1 00:00:00'):

dt=nc.num2date(time,units='days since 1950-01-01 00:00:00')     # Argo 时间标准
argo_dt=nc.date2num(dt,units='seconds since 2000-1-1 00:00:00') #与smap中的时间对应

关于相关函数的使用可以参考引用的链接

https://www.programcreek.com/python/example/89488/netCDF4.num2date

https://unidata.github.io/netcdf4-python/

https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2077850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 模块化开发:ES6 模块与 CommonJS 的对比与应用

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 随着前端项目规模的增长&#xff0c;代码组织和管理变得越来越复杂。模块化开发成为解决这一问题的有效手段&#xff0c;能够帮助开发者将代码进行分割、复用和维护。JavaScript 在发展过程中出现了多种模块化规范&…

【精通SDL之----使用PBO异步传输像素数据】

使用PBO异步传输像素数据 前言一、 一些GPU 分配的常用内存对象介绍二、 PBO 传输原理三、 PBO 使用方法 前言 书接上文【精通SDL之----SDL_RenderReadPixels截屏】&#xff0c;SDL_RenderReadPixels在GLES2上是一个非常耗时的操作&#xff0c;因为   1. OpenGL ES 是一个异步…

.NET Razor类库 - 静态资源组件化

1. 找到Razor类库 打开VS2022 文件 - 新建 - 项目 或者 使用 CtrlShiftN 快捷键 输入Razor 搜索 &#xff0c; 选中Razor类库&#xff0c; 点击 下一步2.创建Razor类库项目 输入项目名称 IX.RCL.Front RCL 是 RazorClassLibrary的简称意思 Front 代表前端静态资源的意思 位…

KEIL Stm32 bin文件生成的两种方法以及报错的处理

Keil里生成bin文件的方法有两种&#xff0c;记录如下&#xff0c;以免忘记~ 首先&#xff0c;在Keil主页面&#xff0c;点击如下按钮&#xff0c;打开Options for Target ‘target 1’对话框&#xff0c;并选择User标签页。 其次&#xff0c;通过在 User标签页 设置 “After B…

一种基于 JavaEE 的合同管理系统,用于存储、管理和跟踪合同的软件工具,功能很完善(附源码)

前言 在现代企业管理中&#xff0c;合同管理是一项至关重要的任务。传统的手动管理合同不仅耗时耗力&#xff0c;而且容易出现错误和遗漏&#xff0c;导致合同执行效率低下&#xff0c;甚至面临法律风险。随着业务的不断扩展&#xff0c;越来越多的企业开始寻求一种更为高效、…

作为HR,如何解决简历筛选难度大的问题

简历筛选需要耗费大量的时间和精力&#xff0c;尤其是当应聘者过多的情况下&#xff0c;往往让HR精疲力竭&#xff0c;而且效率低下。当下也有很多这方面的工具可以辅助的&#xff0c;如&#xff1a;招聘管理&#xff0c;简历解析类等。 借助软件&#xff0c;可以更好的获取简…

GLM-4-Flash 大模型API免费了,手把手构建“儿童绘本”应用实战(附源码)

老牛同学刚刷到了一条劲爆的消息&#xff0c;GLM-4-Flash大模型推理 API 免费了&#xff1a;https://bigmodel.cn/pricing 老牛同学一直觉得上次阿里云百炼平台为期 1 个月免费额度的“羊毛”已经够大了&#xff08;太卷了&#xff0c;阿里云免费 1 个月大模型算力额度&#xf…

什么是BI?BI系统的功能有哪些?哪些人需要BI工具支持?

什么是BI&#xff1f; BI是商业智能&#xff08;Business Intelligence&#xff09;的缩写。它是指通过收集、整理、分析和可视化企业内部和外部数据&#xff0c;从中获得洞察信息和决策支持的技术和流程。BI利用数据分析工具和技术&#xff0c;帮助企业管理者和决策者更好地理…

Cesium 展示——获取指定区域地形的最大最小高程

文章目录 需求分析方法一:方法二:需求 在地图上勾选某一处的区域,分析获取区域内最大最小高程 分析 方法一: function getAreaHeight(viewer, positions) {const startP = positions[0

备考AMC10美国数学竞赛2024:吃透1250道真题和知识点(持续)

有什么含金量比较高的初中生数学竞赛吗&#xff1f;美国数学竞赛AMC10是个不错的选择。那么&#xff0c;如何备考AMC10美国数学竞赛呢&#xff1f;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛…

解决tensorflow模型加载时把GPU显存占满的问题(亲测效果显著)

第一次用tensorflow模型进行推理。 初始状态下&#xff0c;显存的占用情况 模型加载后&#xff0c;电脑显存直接快拉满了&#xff0c;但是模型参数量并不大&#xff0c;这就很奇怪,究竟这是一股什么神秘的力量&#xff0c;竟要试图侵占我可怜的显卡宝贝 原因分析:安装了tensor…

fastadmin表单中二维数组组件+图片上传

记录&#xff1a;fastadmin表单中二维数组组件图片上传 add.html代码 <div class"form-group"><label class"control-label col-xs-12 col-sm-2">{:__(Quanyi)}:</label><div class"col-xs-12 col-sm-10"><style>…

多个FeignClient使用相同服务名报错问题:使用contextId区分不同FeignClient

一、概述 在项目开发中&#xff0c;由于多个 FeignClient 使用了相同的 name &#xff0c;导致SpringBoot启动时出现 BeanDefinitionOverrideException 异常。 解决方案是在每个 FeignClient 上添加唯一的 contextId&#xff0c;如 userFeignClient 和 helloWorldFeignClient…

低功耗高效率同步降压变换器SiLM6880/SiLM6881 为工业应用领域电源提供强力支撑

为了满足现代电子设备对性能和能耗的更高要求&#xff0c;并不断推动电源技术的优化与创新&#xff0c;深力科推荐一款——低功耗、高效率的同步降压变换器SiLM6880/SiLM6881。 SiLM6880/SiLM6881具有宽泛的输入电压范围&#xff08;6V~80V&#xff09;&#xff0c;能适应各种电…

LLM分布式预训练浅析

随着深度学习的不断进步&#xff0c;语言模型的规模越来越大&#xff0c;参数量级已经达到了数千亿甚至数万亿&#xff0c;参数规模的指数增长带来了两个巨大的挑战 1&#xff09;模型参数过大&#xff0c;如GLM 130B模型参数需要520GB&#xff08;130B*4bytes&#xff09;的显…

【Latex】Latex 简介和安装

Latex LaTeX 是一种基于排版的文档准备系统&#xff0c;广泛用于创建高质量的科学和数学文档。它的核心是 TeX 语言&#xff0c;由美国计算机科学家 Donald Knuth 在 1978 年开发。LaTeX 简化了文档的格式化过程&#xff0c;尤其是在处理复杂的公式、引用、表格、图表等方面&a…

Java IO精髓:高效块读写入技术深入解析

文件的复制 首先我们先用昨天学习的知识来完成文件的复制,使用read和write方法来完成。 public static void main(String[] args) throws IOException {FileInputStream fis new FileInputStream("./image.png");FileOutputStream fos new FileOutputStream("…

OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141561865 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

加速边缘智能技术落地!移远通信推出全功能ARM主板QSM560DR、QSM668SR系列

8月22日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;正式推出其两款全功能ARM主板——QSM560DR与QSM668SR系列。 作为智能设备开发与硬件设计的核心平台&#xff0c;这两款ARM主板以卓越的集成度和性能、广泛的兼容性以及丰富的功能接口&#xff0…

零基础学习人工智能—Python—Pytorch学习(八)

前言 本文介绍卷积神经网络的上半部分。 其实,学习还是需要老师的,因为我自己写文章的时候,就会想当然,比如下面的滑动窗口,我就会想当然的认为所有人都能理解,而实际上,我们在学习的过程中之所以卡顿的点多,就是因为学习资源中想当然的地方太多了。 概念 卷积神经网络…