文章目录

  • 什么是“POSIX"
  • POSIXct和POSIXlt的区别
    • POSIXlt
      • POSIXlt类的属性
      • 关于时区
    • POSIXct
    • 有趣的实验
  • 更多参考

什么是“POSIX"

  R语言中有两个时间类对象,POSIXctPOSIXlt。对于我这种非专业的人员来说,看到这个名称是懵的,不知道这是什么单词的首字母缩写。在网上搜了一下才知道。“POSIX”的全称为“Portable Operating System Interface of UNIX” 翻译成中文是“可移植操作系统接口”,POSIX标准定义了操作系统应该为应用程序提供的接口标准。
 “POSIX”是一个IEEE的标准。UNIX系统出来后,出现了各种不同的版本。而计算机程序在不同版本的系统见运行时,出现不兼容的问题。为了解决计算机程序在不同UNIX系统之间的可移植性问题,在1980s诞生了“POSIX”。POSIX规定了一个计算机程序与UNIX系统之间交互的标准。
 在R中,POSIXctPOSIXlt这两个时间类的名称中,POSIX可以看做是一个标签。也就是符合POSIX标准的时间。可以称为“POSIX时间”或者“UNIX时间”。它的定义是从格林威治时间的1970年01月01日00时00分00秒起至现在的总秒数。所以,在R中,如果我们输入
as.numeric(as.POSIXlt("2022-5-1 00:00:00"))
将会得到一个数值
1651334400
 如果我们增加1秒,输入
as.numeric(as.POSIXlt("2022-5-1 00:00:01"))
得到的数值变为
1651334401

POSIXct和POSIXlt的区别

POSIXctPOSIXltltct分别表示“local time”和“calendar time”,是什么意思呢?

  • calendar time是指我们通常意义理解的时间,即公历的多少年多少月多少日
    举个例子看一下:

 在R中,输入a <- as.POSIXlt("2022-5-1 00:00:00"),然后查看a的类型mode(a),得到的输出是
"list"
 输入b <- as.POSIXct("2022-5-1 00:00:00"),然后查看a的类型mode(b),得到的输出是
"numeric"

 也就是说,如果时间是一个POSIXlt类,它的数据结构是list(列表),如果时间是一个POSIXct类,它的数据结构是数字向量。

POSIXlt

POSIXlt类型的日期含有以下列表元素:

sec
0–61: seconds.

min
0–59: minutes.

hour
0–23: hours.

mday
1–31: day of the month

mon
0–11: months after the first of the year.

year
years since 1900.

wday
0–6 day of the week, starting on Sunday.

yday
0–365: day of the year (365 only in leap years).

isdst
Daylight Saving Time flag. Positive if in force, zero if not, negative if unknown.

zone
(Optional.) The abbreviation for the time zone in force at that time: “” if unknown (but “” might also be used for UTC).

gmtoff
(Optional.) The offset in seconds from GMT: positive values are East of the meridian. Usually NA if unknown, but 0 could mean unknown.

所以对于一个POSIXlt的时间,可以通过$来引用它的某个属性,比如:

R命令 输出结果 意义
a$yday 120 是一年中的第120天。
a$zone “CST” 时区是“中国标准时间”
a$isdst 0 不使用夏令时
a$gmtoff NA 该时区与GMT时区的时间差未知

注:CST可以为如下4个不同的时区的缩写:

  • 美国中部时间:Central Standard Time (USA) UT-6:00
  • 澳大利亚中部时间:Central Standard Time (Australia) UT+9:30
  • 中国标准时间:China Standard Time UT+8:00
  • 古巴标准时间:Cuba Standard Time UT-4:00

在这里应该是指中国标准时间。

POSIXlt类的属性

> attributes(a)
$names[1] "sec"    "min"    "hour"   "mday"   "mon"    "year"   "wday"   "yday"   "isdst"
[10] "zone"   "gmtoff"$class
[1] "POSIXlt" "POSIXt" $tzone
[1] "Asia/Shanghai"

可见,POSIXlt类有3个属性,分别是namesclasstzone

关于时区

查看自己计算机R运行环境的时区,可以
Sys.timezone()Sys.getenv("TZ")
如果返回值是空值,则说明你还没有设置时区。通过Sys.setenv(TZ ="Asia/Shanghai")设置时区,再Sys.getenv("TZ")则得到
"Asia/Shanghai"。其中,Asia/Shanghai是时区的ID,不同时区的ID可以搜“国际时区ID列表”查到。
此时,我们再看
a <- as.POSIXlt("2022-5-1 00:00:00")

POSIXct

POSIXct就是一个长度为1的向量,存储的是自原点以来的秒数。但POSIXct虽然可以进行加减运算,但不能进行乘除运算。这提醒我们,POSIXct存储的仍然不是一个数值型数据,而是POSIXct型。

> a <- as.POSIXct("2022-5-1 00:00:00")
> attributes(a)
$class
[1] "POSIXct" "POSIXt" $tzone
[1] ""

可见,POSIXct类型的时间只有classtzone两个属性。

有趣的实验

运行下列命令以及得到的结果

> a <- as.POSIXlt("2022-5-1 00:00:00")
> a$gmtoff
[1] NA> a <- as.POSIXlt(as.POSIXct("2022-5-1 00:00:00"))
> a$gmtoff
[1] 28800> attr(a,"tzone")
[1] "Asia/Shanghai" "CST"           "CDT"  #不知道这个"CDT" 是什么

可以看到,将时间字符串转换为时间类时,如果直接转换为POSIXlt类型,则其gmtoff内容为NA;如果先转换为POSIXct,再转换为POSIXlt则其gmtoff内容不是空的。28800 秒正好就是8小时,也就是时区Asia/Shanghai时间与UTC的时间差。

这是为什么?

  事实上,正是这个问题导致我要更深入了解POSIXctPOSIXlt的区别。在比较两个POSIXlt类型的时间元素时(假设是a和b),我发现a==b返回的结果是TRUE,但setequal(a,b)得到的结果就是FALSE,这给我带来了极大的困惑。我想,正在表面上a和b完全一样的背后肯定有隐藏的东西我还没看到。现在我才知道,原来是其中一个时间是经过了POSIXct转换到POSIXlt格式的,而另外一个时间是直接转换为POSIXlt的。他们两个的差就在gmtoff这里。通过在网上搜索学习,解决这个问题,我还是挺欣慰的。当然,这种无知在R高手看来可能有点儿可笑。
问题解决了,我也不想再深入了,浅尝辄止。遇到新的问题再说吧。

更多参考

https://wrangle-r.rsquaredacademy.com/date-and-time-in-r.html

关于R语言中时间类POSIXct和POSIXlt的一点儿学习收获相关推荐

  1. r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf

    ​注: 本文是R语言sf包的核心开发者和维护者--来自德国明斯特大学的地理信息学教授:Edzer Pebesma 的一篇关于sf包的简介,发表于2018年7月的R语言期刊,主要讲述了sf的定位.功能. ...

  2. r语言中正定矩阵由于误差不正定_R语言之数据处理(一)

    在上一篇小文中,提到了关于R语言导入数据的一些方法,之后的重点就转向了数据的处理上.数据处理其实在整个数据分析项目中所占用的时间是比较多的,所以根据处理的目的不同,也有不同的处理方法.在R语言中,我通 ...

  3. 《R语言编程艺术》——1.4 R语言中一些重要的数据结构

    1.4 R语言中一些重要的数据结构 R有多种数据结构.本节将简单介绍几种常用的数据结构,使读者在深入细节之前先对R语言有个大概的认识.这样,读者至少可以开始尝试一些很有意义的例子,即使这些例子背后更多 ...

  4. 如何在R语言中建立六边形矩阵热图heatmap可视化

    原文链接:http://tecdat.cn/?p=18879 这是一个六边形热图可视化程序,主要用到的知识RColorBrewer,fields,也就是R中的可视化绘图库(点击文末"阅读原文 ...

  5. 摘:C/C++中时间类time.h

    摘要: 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时.时间的获取.时间的计算和显示格式等方面进行了阐述.本文还通过大量的实例向你展示了time.h头文件 ...

  6. Java快速入门学习笔记7 | Java语言中的类与对象

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  7. 技巧 | 在R语言中使用高德地图的API进行地理/逆地理编码(地址与经纬度的相互转换)...

    高德地图和百度地图都提供了坐标拾取系统,通过坐标查询或坐标反查操作可以查询一个地址对应的经纬度或经纬度对应的地址名称.但是,手动查询的方式效率很低,也不能进行批量查询. 本篇就来介绍在R语言中调用高德 ...

  8. raster | R语言中的空间栅格对象及其基本处理方法(Ⅰ)

    前面的系列推文已经完成了对R语言中的两个管理空间矢量数据的工具包(sf和sp)的介绍,以及空间自相关.空间插值等空间分析方法. 这里小编再推出一个系列来介绍R语言中管理空间栅格数据的工具包:raste ...

  9. R语言中的数据处理包dplyr、tidyr笔记

    R语言中的数据处理包dplyr.tidyr笔记 dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其 ...

最新文章

  1. 【杂谈】言有三一门CSDN视频课赚160万?你想的太、太、太多了
  2. windows 下 putty 登陆服务器 显示matlab图形界面
  3. 页脚保持在未满屏页面的底部
  4. Atitit opencv版本新特性attilax总结
  5. 技嘉h310主板前置音频没声音_电脑前置插孔没声音 前置音频没声音解决方法
  6. Echarts教程篇:概览
  7. 教你用C调1645和弦,写出不一样的歌
  8. 台式计算机配置单,最新台式电脑组装配置推荐
  9. 收藏夹吃灰了:GitHub 上值得收藏的100个精选前端项目!
  10. 在Ubuntu上安装NTL
  11. svn拉取和提交大概步骤
  12. Android Studio 生成二维码、生成带logo的二维码
  13. 小程序如何cdn加速服务器,小程序游戏加速方案
  14. 十字军之王3Crusader Kings III mac中文
  15. php 微信开发实战pdf,微信开发实战之模块化的实例详解
  16. python 0基础如何做出雷霆战机?【源码送上】
  17. python3 判断素数
  18. style=扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A、2各4张,小王1张,大王1张。 牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大
  19. Leetcode_35_Search Insert Position
  20. 蓝桥杯2017年第八届蓝桥杯

热门文章

  1. php 读取 excel 文件并上传数据库
  2. ElasticSearch | 01 使用场景和概要介绍
  3. 从浏览器地址栏输入url到请求返回发生了什么(深问)
  4. UBT7:ubuntu安装navicat15
  5. python网络爬虫权威指南(第2版)pdf_用Python写网络爬虫(第2版) PDF 下载
  6. Unity Android通过拍照和相册上传头像(图片)
  7. 我用Python爬取了妹子网100G的套图
  8. C/C++超全资料,编程发烧友不可不分享
  9. 视频编辑器-MovieMator简洁使用-功能和快速入门-创建项目、导入和导出
  10. MQL4读取hst文件代码范例