GEE必须会教程—时间都去哪了(Date参数类型)

时间和空间是世界存在的两种基本属性,大部分的数据都有特有的通道存储时间信息,用户需要通过获取数据存储的信息,来判断数据的可用性,以及数据在时间上发生的变化。在遥感上,空间数据集合中,时间信息显得更加重要,研究人员需要通过时间信息判断地物类型发生的变化,在时间序列上展开分析。时间都去哪了?是大家要面对的共性问题,今天我们探讨一下,GEE平台上的日期参数类型。

一、Date参数类型

日期作为GEE的参数类型,共包括两种,一种指的是特定的日期,一种指的是日期的范围。先看到Date参数类型。

1.定义日期

老样子,凡是先定义,GEE上定义一个日期有多种方法,且看:

//定义日期
var date1 = ee.Date("2023-01-01");
print("date1:",date1);
var date2 = ee.Date.parse("YYYYDDD","2023010");
print("date2:",date2);
//var date2 = ee.Date.fromYMD(2020,01,01);

一种是直接采用ee.Date方法定义直接定义日期,方便快捷。一种是利用parse方法,通过指定格式和对应的日期进行创建,//后面给出了第三种方法,采用fromYMD格式,进行日期的格式化创建。

有没有小伙伴想知道GEE上最早的时间定义的是什么时候,要知道这个,我们不烦耍点小聪明,用24*60*60*1000(h*min*se*mi),这个算式表示的含义是距初始时间一天的时间算式表达方式。

//判断GEE上最开始的时间加一天的日期是
var Date = ee.Date(24*60*60*1000);
print("Date",Date);
var InitialDate = ee.Date("1970-01-01");
print("IDate",InitialDate);

此时我们会发现一个神奇的现象:

从打印的结果可以看出,时间是1970-01-02,此时我们反推一天,是不是能够得到GEE平台上定义的初始时间就是1970-01-01呢?小编写了个代码验证了一下,欸!发现它的value值等于0,说明1970-01-01是初始时间,这是一个神圣的日子,大家要记住。

2.获取时间单位的占比

如果想知道当前日期在一年中的占比,可以这样:

//获取时间单位的比例
var time = ee.Date("2020-03-02");
var fraction = time.getFraction("year");
print(time,fraction,(31+29+2)/366);

此处使用getFraction方法,获取了该时间在一年中所占的比例,即年份的小数部分,打印时我们手算了一下(2024年是闰年记得哈),对比一下输出结果:

可以看出,手算和机算之间还是有差别的,这里的结果不一样是因用前者方法返回的是一个精确的小数值,而手动计算的结果,可能存在四舍五入或者精度损失的情况。因此,两者的值可能会有微小的差异。

3.获取前一天或者是后一天的数据

接下来要分享的方法对于时间序列很重要,有时候写循环,需要让时间能够自动实现递增或者是递减,也即依据当前日期获得前一天或者是后一天的日期。

//获取后一天或者是前一天,单位可以是year,month,week,day,hour,minute,second
var date3 = ee.Date("2024-01-01");
var nextDate = date3.advance(1,"month");
var preDate = date3.advance(-1,"day");
print("nextDate:",nextDate);
print("preDate:",preDate);

要实现上述目标,我们要用到advance方法,该方法两个参数中,前者是数字,代表日期的递增步长,后者的字符串代表时间单位,可以是年月日小时分钟等多种单位,具体应用何种单位要依据各位小可爱的实际研究情境确定。这个一定要记住,以后我们在时间序列分析过程中会经常看到它。

4.获取日期间隔

知道两个日期,怎么得到两个日期之间的间隔?

//日期间隔,单位可以是year,month,week,day,hour,minute,second
var date4 = ee.Date("2024-02-01");
var date5 = ee.Date("2024-02-22");
var gap1 = date5.difference(date4,"day");
var gap2 = date5.difference(date4,"hour");
var gap3 = date5.difference(date4,"week");
print("gap1:",gap1);
print("gap2:",gap2);
print("gap3:",gap3);

间隔采用difference命令,该方法可以指定要计算间隔的时间单位,此处小编以天、小时和周来举例子,且看代码的运行结果:

按天来看,两个日期之间相差21天,按小时来看,21*24=504h,按周来算,21/7 = 3。

5.计算逝去时间

如果想知道想现日期相对于当年以某个特定的时间单位逝去的时间,应该如何做?

//计算当前日期为一年中的第几天(指定格式,相对于这一年的开始)
var date6 = ee.Date("2024-02-02");
var day1 = date6.getRelative("day","year");
var day2 = date6.getRelative("day","month");
var month = date6.getRelative("month","year");
print("day1:",day1,"day2:",day2,"month:",month);

要实现上述目标,我们需要用到GEE的getRelative,此处小编以一年当中的第几天,一月当中的第一天,一年当中的第几月为例子,得到下列结果:

2024年2月2日相对于2024年1月1日是32天,从月份来看,2月2日相对于2月1日是过了一天,2024年2月相对与2024年1月时间过去一个月,因此结果如上,你理解了嘛?

6.按照指定格式获取日期时间

有时我们只想知道一年,或者某月等的时间,那么只需要想如下:

//按照指定格式获取日期
var date7 = ee.Date("2024-02-20");
var Day = date7.format("dddd");
var Month = date7.format("MM");
print("Day:",Day,"Month:",Month);

利用format方法,并添上合适的日期格式,小编这里设置的是用4为数字表示天(dddd),用两位数字表示月份(MM),注意单位是其英文的缩写,即可得到想要的结果。

7.获取指定日期的年月日等时间信息

这个就像去字典里面取属性一般,使用get方法即可:

//获取日期的年月日等信息
var date8 = ee.Date.parse("yyyy-mm-dd HH:mm:ss","2024-02-22 17:22:48");
print("Year:",date8.get("year"));
print("Month:",date8.get("month"));
print("Week:",date8.get("week"));
print("Day:",date8.get("day"));
print("Hour:",date8.get("hour"));
print("Minute:",date8.get("minute"));
print("Second:",date8.get("second"));

通过上述代码,能够得到每一个时间单位存储的时间信息:

二、DateRange参数类型

聊完了Date类型,我们还要接触一下时间范围DateRange的基操。

1.定义时间范围:

//时间段的定义
var range1 = ee.DateRange("2020-01-01");
var range2 = ee.DateRange("2020-01-01","2020-02-01");
print(range1,range2);

定义日期的时间范围,采用ee.DateRange即可,小编此处举了两个例子,运行的结果如下:

如果只是给定了一个日期,能实现时间范围的定义嘛?当然,如上导出的结果所示,此时GEE会自动创建一个时间范围,二者之间相差一个毫秒。第二个时间范围不用过多解释,就是形成了一个正常的时间范围。

2.创建无限时间范围

小编想创建一个时间范围,从起始时间开始延申至无限,可以包含任意的时间段,能做到吗?用unbounded方法,一键生成无限时间段:

//创建无限时间段
var range3 = ee.DateRange("1990-01-01","2024-02-01");
var unbound = ee.DateRange.unbounded();
var test = unbound.contains(range3);
print("range3:",range3,"test:",test);

此处unbound变量存储是定义的无限时间段,信不信它能够包含定义的长时间范围range3,且看结果吧!!见证奇迹的时候到了!

测试结果是true,小编没骗你吧,是无限的时间段。

3.时间段合并

给定任意的两个时间段可以进行合并嘛?

//时间段的合并
var range4 = ee.DateRange("2020-01-01","2020-02-01");
var range5 = ee.DateRange("2020-04-01","2020-06-01");
var union = range4.union(range5);
print("Union",union);

时间的合并采用的是union方法,该方法能够联合两个时间范围,无论两个时间段是首尾相连,彼此有交叉还是相互独立(本例),union会选择时间段的最小日期和最大日期进行合并,组成一个更宽的时间段,本代码结果如下:

4.求时间段交集

如果把刚刚的合并看成是求时间段之间的并集,那么问题来了,给定两个时间段,我们应该怎么样得到两个时间段之间的交集呢?

//时间段的相交
var range6 = ee.DateRange("2020-01-01","2020-04-01");
var range7 = ee.DateRange("2019-12-01","2020-05-27");
var intersection = range6.intersection(range7);
print("Intersection",intersect);

借助intersection方法,我们能够很方便得到两个时间段之间的交集,结果如下:

5.判断时间段的相交与包含与否

在进行上述的求交集等的操作时,我们要判断时间段之间是否存在相交关系,或者是包含关系,更希望得到一个肯定或者否定的答案,我们可以这样做:

//时间段的相交与包含与否
var range9 = ee.DateRange("2022-04-01","2022-08-01");
var range10  = ee.DateRange("2022-01-01","2022-06-01");
var intersect = range9.intersects(range10);
var contain = range9.contains(range10);
print("Is Intersect:",intersect,"Is contasin:",contain);

相交关系用intersects,注意区别于前面的intersection方法,包含关系用contains。结果如下:

6.时间段的内容判断

给定一个错误的时间段,如何设置检查点?

//时间段的内容判断
var range11 = ee.DateRange("2022-01-01","2012-01-01");
var isempty = range11.isEmpty();
var isunbounded = range11.isUnbounded();
print("isempty:",isempty,"isunbounded",isunbounded);

上面,小编给出了一个错误的时间范围,使用isEmpty方法,如果返回值为true,代表时间范围为空值,或使用isUnbounded,如果返回值为true,代表无限段时间范围内包含小编定义的时间段,反之。本代码得到的结果如下:

7.时间段首末日期的获取

最后一个方法水一下,什么意思自己理解hhh

//获取时间段的初始和结尾时间
var range8 = ee.DateRange("2021-06-01","2021-08-01");
var start = range8.start();
var end = range8.end();

关于GEE平台上拥有的参数类型—时间的学习分享到这里就结束了,希望对大家入门GEE有帮助!

本篇文章代码链接分享:

https://code.earthengine.google.com/8ebb59711931dec387985b1565d7ab39icon-default.png?t=N7T8https://code.earthengine.google.com/8ebb59711931dec387985b1565d7ab39

GEE学习之路不易,大家加油!更多内容,欢迎关注小编的后续分享!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习——强化学习作业

作业内容 成功降落在两个黄色旗子中间为成功,其他为失败 Policy Gradient方法 Actor-Critic方法 范例结果 baseline Policy Gradient实现

Java 面向对象进阶 15 接口(黑马)

案例: 代码: Animal类代码: public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public…

OpenGauss数据库本地搭建并结合内网穿透实现远程访问

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合…

jetson是什么?

jetson是NVIDIA推出的一系列嵌入式计算板,用于边缘计算。这些板卡专门设计用于加速机器学习和计算机视觉等人工智能应用,它们是低功耗设备,非常适合在无人机、机器人、智能相机和其他自动化设备中使用。 Jetson板卡包括多种型号,…

C#使用一个泛型方法操作不同数据类型的数组

目录 一、泛型方法及其存在的意义 二 、实例 1.源码 2.生成效果 再发一个泛型方法的示例。 一、泛型方法及其存在的意义 实际应用中,查找或遍历数组中的值时,有时因为数组类型的不同,需要对不同的数组进行操作,那么,可以使用…

运维SRE-16 自动化批量管理-ansible2

7.6ansible-软件包管理模块 yum_repository(管理yum源) yum(yum命令) get_url(wget命令)1)yum源配置管理模块 yum源模块 yum_repositoryyum源配置文件内容name[epel]yum源中的名字(中括号里面的名字即可)descriptionnamexxxxxxyum源的注释说明baseurlbaseurlyum源…

来分析两道小题

一、源码 二、分析 首先它会接两个参数一个是id一个是ps,传递的话会包含一个flag.php,然后数据库连接,之后传递过滤,然后查询,如果查到了就会取id,取出来看是不是跟adog一样,如果是它告诉你账号…

watchpoint

前言 内存被踩,通过 watchpoint 找到真凶 实例 以 smsc911x 网卡驱动为基体,进行实验,和网卡本身功能无关, 每执行一次 ifconfig eth0 up,就会调用一次 smsc911x_open(),我在这里设计了一段代码&#xf…

私域流量运营利器,解锁转化新境界

企业在私域流量运营中,掌握认知、方法论、工具、及落地团队是四位一体的关键。团队建设、运营工具辅助、私域流量的载体选择都是至关重要的环节,其中企业微信与个人微信是目前最热门的私域流量载体。 企业微信与个人微信,两者各有千秋&#…

生产监控、故障诊断、实时预警…… DolphinDB 工业物联网智能运维解决方案

随着数字化转型的浪潮兴起,越来越多企业认识到工业物联网在提升工业生产安全性和效率方面的关键作用。然而,随着设备规模的扩大和工艺复杂性的提升,智能化运维监管成为工业企业急需解决的重要挑战。 智能运维是一种利用先进技术和数据分析方…

Nginx网络服务三-----(三方模块和内置变量)

1.验证模块 需要输入用户名和密码 我们要用htpasswd这个命令,先安装一下httpd 生成文件和用户 修改文件 访问页面 为什么找不到页面? 对应的路径下,没有这个文件 去创建文件 去虚拟机浏览器查看 有的页面不想被别人看到,可以做…

2024022201-并发控制

并发控制 多事务执行方式 (1)事务串行执行 每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行不能充分利用系统资源,发挥数据库共享资源的特点 (2)交叉并发方式(interleaved concurrency) 事务的并行执行是…