Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将netcdf时间变量转换为R日期对象

将netcdf时间变量转换为R日期对象
EN

Stack Overflow用户
提问于 2017-09-01 05:43:48
回答 3查看 7.6K关注 0票数 8

我有一个带有timeseries的netcdf文件,时间变量具有以下典型的元数据:

代码语言:javascript
运行
AI代码解释
复制
    double time(time) ;
            time:standard_name = "time" ;
            time:bounds = "time_bnds" ;
            time:units = "days since 1979-1-1 00:00:00" ;
            time:calendar = "standard" ;
            time:axis = "T" ;

在R内部,我想将时间转换为R日期对象。目前,我以硬连接的方式实现了这一点,方法是读取单元属性并拆分字符串,并使用第三个条目作为我的来源(因此假设间隔为“天”,时间为00:00等等):

代码语言:javascript
运行
AI代码解释
复制
require("ncdf4")
f1<-nc_open("file.nc")
time<-ncvar_get(f1,"time")
tunits<-ncatt_get(f1,"time",attname="units")
tustr<-strsplit(tunits$value, " ")
dates<-as.Date(time,origin=unlist(tustr)[3])

这个硬连接解决方案适用于我的具体示例,但我希望R中可能有一个包,它很好地处理时间单位的工发组织and netcdf日期约定,并将它们安全地转换为R date对象?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-12 09:11:48

我刚刚发现(在贴出这个问题两年后!)有一个名为ncdf.tools的包,它具有以下功能:

convertDateNcdf2R

哪一个

从指定的netCDF文件或朱利安日(或秒、分钟、小时)向量转换为POSIXct R向量的时间向量。

使用:

代码语言:javascript
运行
AI代码解释
复制
convertDateNcdf2R(time.source, units = "days", origin = as.POSIXct("1800-01-01", 
    tz = "UTC"), time.format = c("%Y-%m-%d", "%Y-%m-%d %H:%M:%S", 
    "%Y-%m-%d %H:%M", "%Y-%m-%d %Z %H:%M", "%Y-%m-%d %Z %H:%M:%S"))

参数:

代码语言:javascript
运行
AI代码解释
复制
time.source 

数字向量或netCDF连接:从原点开始的时间单位或netCDF文件连接,在后一种情况下,时间向量是从netCDF文件中提取出来的,这个文件,特别是时间变量,必须遵循CF netCDF约定。

代码语言:javascript
运行
AI代码解释
复制
units   

字符串:时间源的单位。如果源是netCDF文件,则忽略该值并从该文件读取该值。

代码语言:javascript
运行
AI代码解释
复制
origin  

POSIXct对象:时间源的来源或日/小时为零。如果源是netCDF文件,则忽略该值并从该文件读取该值。

因此,只需将netcdf连接作为第一个参数传递就足够了,而函数则处理其余的参数。警告:这只有在netCDF文件遵循 CF公约 (例如,如果您的单元是“多年”而不是“秒”或“天”之后)时才能工作。

有关该函数的更多详细信息可在此处获得:https://rdrr.io/cran/ncdf.tools/man/convertDateNcdf2R.html

票数 5
EN

Stack Overflow用户

发布于 2017-09-01 23:53:51

据我所知,没有。我有一个使用lubridate的方便的函数,它与您的基本相同。

代码语言:javascript
运行
AI代码解释
复制
getNcTime <- function(nc) {
    require(lubridate)
    ncdims <- names(nc$dim) #get netcdf dimensions
    timevar <- ncdims[which(ncdims %in% c("time", "Time", "datetime", "Datetime", "date", "Date"))[1]] #find time variable
    times <- ncvar_get(nc, timevar)
    if (length(timevar)==0) stop("ERROR! Could not identify the correct time variable")
    timeatt <- ncatt_get(nc, timevar) #get attributes
    timedef <- strsplit(timeatt$units, " ")[[1]]
    timeunit <- timedef[1]
    tz <- timedef[5]
    timestart <- strsplit(timedef[4], ":")[[1]]
    if (length(timestart) != 3 || timestart[1] > 24 || timestart[2] > 60 || timestart[3] > 60 || any(timestart < 0)) {
        cat("Warning:", timestart, "not a valid start time. Assuming 00:00:00\n")
        warning(paste("Warning:", timestart, "not a valid start time. Assuming 00:00:00\n"))
        timedef[4] <- "00:00:00"
    }
    if (! tz %in% OlsonNames()) {
        cat("Warning:", tz, "not a valid timezone. Assuming UTC\n")
        warning(paste("Warning:", timestart, "not a valid start time. Assuming 00:00:00\n"))
        tz <- "UTC"
    }
    timestart <- ymd_hms(paste(timedef[3], timedef[4]), tz=tz)
    f <- switch(tolower(timeunit), #Find the correct lubridate time function based on the unit
        seconds=seconds, second=seconds, sec=seconds,
        minutes=minutes, minute=minutes, min=minutes,
        hours=hours,     hour=hours,     h=hours,
        days=days,       day=days,       d=days,
        months=months,   month=months,   m=months,
        years=years,     year=years,     yr=years,
        NA
    )
    suppressWarnings(if (is.na(f)) stop("Could not understand the time unit format"))
    timestart + f(times)
}

编辑:您可能还想看看ncdf4.helpers::nc.get.time.series

EDIT2:请注意,新提议的、目前正在开发的可怕的stars包将自动处理日期,有关示例请参阅第一篇博文

EDIT3:另一种方法是直接使用units包,这就是stars所使用的。人们可以这样做:(仍然没有正确地处理日历,我不确定units能不能)

代码语言:javascript
运行
AI代码解释
复制
getNcTime <- function(nc) { ##NEW VERSION, with the units package
    require(units)
    require(ncdf4)
    options(warn=1) #show warnings by default
    if (is.character(nc)) nc <- nc_open(nc)
    ncdims <- names(nc$dim) #get netcdf dimensions
    timevar <- ncdims[which(ncdims %in% c("time", "Time", "datetime", "Datetime", "date", "Date"))] #find (first) time variable
    if (length(timevar) > 1) {
        warning(paste("Found more than one time var. Using the first:", timevar[1]))
        timevar <- timevar[1]
    }
    if (length(timevar)!=1) stop("ERROR! Could not identify the correct time variable")
    times <- ncvar_get(nc, timevar) #get time data
    timeatt <- ncatt_get(nc, timevar) #get attributes
    timeunit <- timeatt$units
    units(times) <- make_unit(timeunit)
    as.POSIXct(time)
}
票数 3
EN

Stack Overflow用户

发布于 2017-09-20 06:59:33

我无法使用@af7的函数来处理我的文件,所以我编写了自己的文件。下面的函数创建一个日期的POSIXct向量,从nc文件中读取开始日期、时间间隔、单位和长度。它适用于许多nc文件(但可能不是每个.)形状或形式。

代码语言:javascript
运行
AI代码解释
复制
 ncdate <- function(nc) {
    ncdims <- names(nc$dim) #Extract dimension names
    timevar <- ncdims[which(ncdims %in% c("time", "Time", "datetime", "Datetime",
                                          "date", "Date"))[1]] # Pick the time dimension
    ntstep <-nc$dim[[timevar]]$len
    tm <- ncvar_get(nc, timevar) # Extract the timestep count
    tunits <- ncatt_get(nc, timevar, "units") # Extract the long name of units
    tspace <- tm[2] - tm[1] # Calculate time period between two timesteps, for the "by" argument 
    tstr <- strsplit(tunits$value, " ") # Extract string components of the time unit
    a<-unlist(tstr[1]) # Isolate the unit .i.e. seconds, hours, days etc.
    uname <- a[which(a %in% c("seconds","hours","days"))[1]] # Check unit
    startd <- as.POSIXct(gsub(paste(uname,'since '),'',tunits$value),format="%Y-%m-%d %H:%M:%S") ## Extract the start / origin date
    tmulti <- 3600 # Declare hourly multiplier for date
    if (uname == "days") tmulti =86400 # Declare daily multiplier for date
    ## Rename "seconds" to "secs" for "by" argument and change the multiplier.
    if (uname == "seconds") {
        uname <- "secs"
        tmulti <- 1 }
    byt <- paste(tspace,uname) # Define the "by" argument
    if (byt == "0.0416666679084301 days") { ## If the unit is "days" but the "by" interval is in hours
    byt= "1 hour"                       ## R won't understand "by < 1" so change by and unit to hour.
    uname = "hours"}
    datev <- seq(from=as.POSIXct(startd+tm[1]*tmulti),by= byt, units=uname,length=ntstep)
}

编辑

为了解决@af7注释中强调的上述代码只适用于有规则间隔的文件的缺陷,可以将datev计算为

代码语言:javascript
运行
AI代码解释
复制
 datev <- as.POSIXct(tm*tmulti,origin=startd)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46001573

复制
相关文章
关于在angular2中引入第三方插件或者框架(jquery)
由于本人也是初入angular2不久,很多问题也许解决了,确不知其原由,也有一些问题,解决了后面又出来同样的错误,关于这些,请谅解. 关于这个问题,我自己也是想了很久,总算是能用上了, 想在angular2中引用jquery的话,高大上的一个方法是,在package.json中的dependencies中写入,执行cnpm i;安装; "dependencies": { "@angular/common": "^4.0.0", "@angular/compiler": "^4.0.0",
杭州前端工程师
2018/06/15
2.3K0
Sqoop在导入的时候导入多张表
当我们用Sqoop导入一张表的时候可以用 --table <table-name> 去指定要导入一个表,但是我们要导入多个表的话,用这个--table是不行的。 这时候我们可以用Sqoop的import-all-tables加--exclude-tables 进行组合使用,实现我们一次导入多个表的目的。
ZHANGHAO
2018/12/09
6.7K1
Sqoop在导入的时候导入多张表
spring导入第三方资源
配置数据库连接参数时,注入驱动类名是用driverClassName还是driver?
楠羽
2023/10/17
1620
spring导入第三方资源
在高PR值的网站中怎么获得导入连接
这几天忙着在给公司的年会做策划,真累呀,每年的沈阳·K友汇都是公司一个大项目,所以投入的精力还是比较大的,前几天谈论了一个站长要做到是持之以恒,坚持不懈得到了需要朋友的认可,很高兴,今天谈谈关于在高PR的网站上获得导入连接的几个方法;
李洋博客
2021/06/15
2.1K0
在高PR值的网站中怎么获得导入连接
在 Spark 数据导入中的一些实践细节
图谱业务随着时间的推移愈发的复杂化,逐渐体现出了性能上的瓶颈:单机不足以支持更大的图谱。然而,从性能上来看,Neo4j 的原生图存储有着不可替代的性能优势,这一点是之前调研的 JanusGraph、Dgraph 等都难以逾越的鸿沟。即使 JanusGraph 在 OLAP 上面非常出色,对 OLTP 也有一定的支持,但是 GraphFrame 等也足以支撑其 OLAP 需求,更何况在 Spark 3.0 会提供 Cypher 支持的情况下,图谱的 OLAP 需求相比 OLTP 有更多途径可以解决。这个时候,Nebula Graph 的“横空出世”无疑是对分布式 OLTP 效率低下现状的一种突破。
NebulaGraph
2020/11/25
1.6K0
在 Spark 数据导入中的一些实践细节
spring在ssh框架中的作用学习
spring在ssh框架中的作用学习 在SSH框假中spring充当了管理容器的角色。我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语 句。Struts是用来做应用层的,他它负责调用业务逻辑serivce层。所以SSH框架的流程大致是:Jsp页面—-Struts——Service(业务逻辑处理类)—Hibernate(左到右) struts负责控制Service(业务逻辑处理类),从而控制了Service的生命
用户1289394
2018/02/26
1.2K0
Java中的动态代理以及在框架中的应用
我们先假设现在有怎么一个需求,要求你在不改动原有代码的情况下在所有类的方法前后打印日志。我们很容易想到静态代理,具体做法如下:
烂猪皮
2021/06/09
1.3K0
Java中的动态代理以及在框架中的应用
Python怎么导入第三方依赖的Module
初步猜测是没有引入对应的module,因为没写过python代码,所以需要网上找找资料,网上资料说可以用pip install就可以,不过我python环境刚安装,这个命令在哪运行?通过搜索知道需要配置环境变量,这个和java也一样,都是要配环境变量,才能在cmd窗口使用sdk的命令
SmileNicky
2022/05/07
2140
Python怎么导入第三方依赖的Module
ABAQUS-Python第三方库的导入
Python语言上手容易,开源,大量的第三方库可供调用,因此近年来发展迅猛,常年盘踞各类机构推出的程序语言排行榜的前几位。ABAQUS/CAE的前处理基本是依赖于Python语言打造,因此采用Python进行二次开发很方便。
阿信老师CAE
2022/05/17
2K0
ABAQUS-Python第三方库的导入
Sqoop的安装与Mysql的数据导入到hdfs框架中
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
用户2603479
2018/09/19
1.1K0
android studio 导入第三方库的记录
http://blog.csdn.net/lxk_1993/article/details/50493582
103style
2022/12/19
3220
android studio 导入第三方库的记录
神经网络(TensorFlow)游乐场
TensorFlow游乐场是一个通过网页浏览器就可以训练的简单神经网络并实现了可视化训练过程的工具。可以去简单地模拟深度学习的过程。连线越粗表明权重越大。
里克贝斯
2021/05/21
1.5K0
神经网络(TensorFlow)游乐场
在vscode中安装python第三方库
以安装numpy为例,输入pip install numpy,点击回车,安装成功之后会显示如下信息:
全栈程序员站长
2022/11/10
2.3K0
在vscode中安装python第三方库
在Fabric ChainCode中导入第三方包(以状态机为例)
在企业级应用开发中,经常会涉及到流程和状态,而有限状态机(FSM)则是对应的一种简单实现,如果复杂化,就上升到Workflow和BPM了。我们在Fabric ChainCode的开发过程中,也很可能涉及到状态机,这里我们就举一个例子,用FSM实现一个二级审批的状态转移。
深蓝studyzy
2022/06/16
2700
在Fabric ChainCode中导入第三方包(以状态机为例)
Android Studio导入第三方类库的方法
Android Studio导入第三方类库的方法 本人也刚刚开始尝试做android app的开发,听说android studio是Google支持的android 应用开发工具,所以想应该肯定比Eclipse好用吧,反正以前没有java开发经验,索性就从android studio开始学,以前一直是做.net的开发,最近使用了Eclipse,Android Studio之后发现Visual studio.net正式太好用了,不得不说微软的开发工具做的比谁都好。下面是我在使用Android Studio应
阿新
2018/04/12
1.7K0
Android Studio导入第三方类库的方法
在python中实现基于ICE框架的cl
ICE (Internet Communication Engine) 是zeroc公司实现的通信中间件
py3study
2020/01/03
2.2K0
WebAssembly 在 MOSN 中的实践:基础框架篇
本文将介绍 WebAssembly 技术在 MOSN 中的实践,首先介绍了当前 MOSN 在扩展隔离方面所面临的痛点,并对 Wasm 技术的相关背景知识进行介绍。随后描述了 Wasm 扩展框架的整体架构,并介绍了我们在 Proxy-Wasm 社区规范中所做的贡献,最后描述了框架在性能、异常调试等方面的实践内容。 作为金融级服务网格中的流量代理组件,MOSN 在承载蚂蚁数十万服务容器之间流量的同时,也承载着诸多例如限流、鉴权、路由等中间件基础能力。这些能力以不同的扩展形式与 MOSN 运行于同一进程内。非隔离
深度学习与Python
2023/04/01
8220
WebAssembly 在 MOSN 中的实践:基础框架篇
时间轮原理及其在框架中的应用
1)心跳检测。在Dubbo中,需要有心跳机制来维持Consumer与Provider的长连接,默认的心跳间隔是60s。当Provider在3次心跳时间内没有收到心跳响应,会关闭连接通道。当Consumer在3次心跳时间内没有收到心跳响应,会进行重连。Provider侧和Consumer侧的心跳检测机制都是通过定时任务实现的,而且是本篇文章要分析的时间轮HashedWheelTimer处理的。
2020labs小助手
2022/03/28
2.4K0
WebAssembly 在 MOSN 中的实践 - 基础框架篇
作为金融级服务网格中的流量代理组件,MOSN 在承载蚂蚁数十万服务容器之间流量的同时,也承载着诸多例如限流、鉴权、路由等中间件基础能力。这些能力以不同的扩展形式与 MOSN 运行于同一进程内。非隔离的运行方式在保障性能的同时,却也给 MOSN 带来了不可预知的安全风险。
CNCF
2021/04/21
9770
点击加载更多

相似问题

Xcode游乐场框架导入

11

在游乐场中导入框架出错

52

如何将第三方框架导入Xcode游乐场?

49

将分析框架导入游乐场

10

如何在swift游乐场使用随迦太基导入的框架

45
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档