当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R DateTimeClasses 日期时间类


R语言 DateTimeClasses 位于 base 包(package)。

说明

表示日历日期和时间的类 "POSIXlt""POSIXct" 的说明。

用法

## S3 method for class 'POSIXct'
print(x, tz = "", usetz = TRUE, max = NULL, ...)

## S3 method for class 'POSIXct'
summary(object, digits = 15, ...)

time + z
z + time
time - z
time1 lop time2

参数

x , object

要从日期时间类之一打印或汇总的对象。

tz , usetz

对于时区格式,传递给 format.POSIXct

max

numeric 或 NULL ,指定要打印的最大条目数。默认情况下,当 NULLgetOption("max.print") 时使用。

digits

计算的有效位数:应该足够高以准确表示最不重要的时间单位。

...

从其他方法传递或向其他方法传递的进一步参数。

time

日期时间对象

time1 , time2

日期时间对象或字符向量。 (字符向量由 as.POSIXct 转换。)

z

数值向量(以秒为单位)

lop

==!=<<=>>= 之一。

细节

有两类基本的日期/时间。类 "POSIXct" 表示自 1970 年初(UTC 时区)以来的(有符号)秒数,作为数值向量。类 "POSIXlt" 内部是向量的 list,其组件名为 secminhour 表示时间, mdaymonyear 表示日期; wdayyday 表示星期几和一年中的某一天, isdst ,夏令时标志,有时(均为可选) zone ,表示时区的字符串,以及 gmtoff ,与 GMT 的偏移量(以秒为单位),请参阅下面的“POSIXlt 详细信息”部分了解更多详细信息。

这些类对应于“日历时间”的 POSIX/C99 结构(time_t数据类型,“ct”)和“本地时间”(或broken-down时间,“⁠结构tm⁠’数据类型,“lt”),它们也继承了它们的名称。

"POSIXct" 更方便包含在数据帧中,而 "POSIXlt" 更接近人类可读的形式。存在一个虚拟类"POSIXt",这两个类都从该虚拟类继承:它用于允许诸如减法之类的操作来混合这两个类。

这两个类都可以进行逻辑比较和一些算术运算。可以在日期时间对象中添加或减去秒数,但不能添加两个日期时间对象。两个日期时间对象相减相当于使用 difftime 。请注意,除非指定时区,否则 "POSIXlt" 对象将被解释为位于这些操作的当前时区。

这两个类都可能有一个属性 "tzone" ,指定时区。但请注意,它们的含义有所不同,请参阅下面的“时区”部分了解更多详细信息。

不幸的是,时区和闰秒的操作使转换变得复杂(根据这个版本)R的数据,到目前为止 27 天已经有 86401 秒长,最后一次是在(实际上是之前)2017-01-01:额外秒数的时间在对象中.leap.seconds)。如果可能的话,此细节将委托给操作系统服务。似乎一些罕见的系统曾经使用闰秒,但所有已知的当前平台都忽略它们(按照 POSIX 的要求)。这是在构建时检测到并纠正的,所以"POSIXct"使用次数R在任何平台上都不包括闰秒。

"POSIXlt" 对象上使用 c 会将它们转换为当前时区,在 "POSIXct" 对象上使用 "tzone" 属性(如果它们不相同)。

有几次有具体问题。首先,忽略闰秒,而实时时间例如"2005-12-31 23:59:60"(可能)被视为下一秒。然而,它们永远不会由R,并且不太可能作为输入出现。其次,在某些操作系统上,POSIX/C99 标准存在问题"1969-12-31 23:59:59 UTC",即-1在日历时间中,该值在那些操作系统上也用作错误代码。因此as.POSIXct("1969-12-31 23:59:59", format = "%Y-%m-%d %H:%M:%S", tz = "UTC")可能会给NA, 因此as.POSIXct("1969-12-31 23:59:59", tz = "UTC")会给"1969-12-31 23:59:00"。其他操作系统(包括使用的代码R在 Windows 上)单独报告错误,因此能够将该时间视为有效时间。

打印方法遵循 options("max.print")

时区

"POSIXlt"对象通常有一个属性"tzone",长度为 3 的字符向量,给出时区名称(来自TZ环境变量或参数tz的函数创建"POSIXlt"物体;""标记当前时区)以及基准时区和备用(夏令时)时区的名称。有时这可能只是长度为一,给出base timezones姓名。

"POSIXct" 对象还可以具有属性 "tzone" ,即长度为 1 的字符向量。如果设置为非空值,它将确定如何将对象转换为类"POSIXlt",特别是如何打印它。这通常是可取的,但如果您想指定特定时区的对象但要在当前时区打印,您可能需要删除 "tzone" 属性。

有关 POSIXlt 的详细信息

"POSIXlt" 内部是一个名为 list 的向量,表示 date-times,具有以下列表组件

sec

0-61:秒,允许闰秒。

min

0-59:分钟。

hour

0-23:小时。

mday

1-31:一月中的某一天

mon

0-11:年初之后的几个月。

year

自 1900 年以来。

wday

每周 0-6 天,从周日开始。

yday

0-365:一年中的第几天(365 仅适用于闰年)。

isdst

夏令时标志。如果有效则为正值,如果无效则为零,如果未知则为负值。

zone

(可选。)当时有效的时区缩写:""(如果未知)(但 "" 也可能用于 UTC)。

gmtoff

(可选。)与 GMT 的偏移量(以秒为单位):正值表示子午线以东。通常NA表示未知,但0可能表示未知。

组件必须按此顺序排列:在之前仅进行了最低程度的检查R4.3.0。所有对象创建于R4.3.0有可选组件。从早期版本R,最后两个组件在 UTC 中不会出现,并且依赖于平台。现在gmtoff几乎所有当前平台上都有设置:基于 BSD 或glibc(包括 Linux 和 macOS)以及使用tzcode实施附带R(包括 Windows 和默认的 macOS)。

请注意,内部列表结构有些隐藏,因为许多方法(包括 length(x)print()str() )适用于抽象日期时间向量,就像 "POSIXct" 一样。可以通过具有两个索引的 [ 索引来提取和替换单个组件(请参阅示例)。

"POSIXlt" 的分量是 integer 向量,除了 sec ( double ) 和 zone ( character )。然而,大多数用户会将第一个条的数值强制为实数,并将其余条zone强制为整数。

组件 wdayyday 仅供参考,不用于转换为日历时间,也不用于打印 format()as.character()

然而,需要组件 isdst 来区分 DST 结束时的时间:通常凌晨 1 点到凌晨 2 点会出现两次,第一次在 DST 中,然后在标准时间中。在所有其他时间,isdst 都可以从前六个值推断出来,但如果设置不正确,则行为取决于平台。例如,Linux/glibc 在检查时修复了支持 DST 的时区中的错误值,但在没有 DST 的时区中给出了 1 值错误。

对于 “ragged” 和超出范围与 “balanced” "POSIXlt" 对象,请参阅 balancePOSIXlt()

Sub-second 准确度

"POSIXct""POSIXlt" 能够表达秒的几分之一,后者允许更高的精度。因此,两种形式之间的分数转换可能不准确,但精度优于微秒。

仅当设置了 options("digits.secs") 时才打印秒小数部分:请参阅 strftime

时间的有效范围

"POSIXlt" 类可以表示非常广泛的时间(最多数十亿年),但此类时间只能参考时区来解释。

时区的概念最早于 19 世纪被采用,公历于 1582 年引入,但直到 1927 年才得到普遍采用。操作系统服务几乎总是采用公历,并且可能假定该位置首次制定的时区于该日期之前生效。 (最早的立法时区似乎是 1847 年 12 月 1 日的伦敦。)一些操作系统根据时区内某个位置的经度假定以前使用的“本地时间”。

大多数操作系统将 POSIXct 表示为 C 类型 long 。这意味着在 32 位操作系统上,这涵盖了 1902 年到 2037 年期间。在所有已知的 64 位平台上以及我们在 32 位 Windows 上使用的代码,可表示时间的范围是数十亿年:但是,并非所有平台都可以正确转换 1902 年之前或 2037 年之后的时间。一些愚昧的操作系统使用无符号类型,因此无法表示 1970 年之前的时间。

在可能的情况下检测平台限制,并且在限制之外我们使用我们自己的 C 代码。这使用 1902 年使用的 GMT 偏移量(当时没有 DST)或预测的 2030 年至 2037 年之一(选择以便可能的 DST 过渡日为星期日),并使用备用(夏令时)时间仅当 isdst 为正时或(如果 -1 )如果预计 DST 将于当天在 2030 年代开始运行,则区域。

请注意,有些地方(例如罗马)与 UTC 的偏移量在 1902 年之前的年份中有所不同,并且只有在操作系统支持的情况下才能正确处理这些情况。

没有理由认为 DST 规则在未来将保持不变:美国于 2005 年立法,从 2007 年起更改其规则,未来可能会恢复原样。因此,未来一两年以上的转换是推测性的。其他国家/地区已在提前几天通知后更改了其规则(事实上,如果使用夏令时)。因此,未来日期的表示和转换是暂定的。这也适用于时区数据库 in-use 版本之后的日期 - 并非所有平台都会使其保持最新,其中包括旧版本的R使用地点(Windows 和 macOS 上默认使用)。

警告

一些Unix-like系统(尤其是Linux系统)没有环境变量TZ设置,但有内部代码期望它(就像 POSIX 一样)。我们已尝试解决此问题,但如果您得到意外结果,请尝试设置TZ.看Sys.timezone以获得有效的设置。

比较 "POSIXlt" 类的对象时需要非常小心。组件和属性不仅是可选的,而且是可选的。几个组件可能具有“尚未确定”的值,并且在不同时区表示的同一时间看起来会完全不同。

"POSIXlt" 对象的列表组件的顺序不得更改,因为一些基于 C 的转换方法依赖于顺序来提高效率。

例子

## IGNORE_RDIFF_BEGIN
(z <- Sys.time())             # the current date, as class "POSIXct"

Sys.time() - 3600             # an hour ago

as.POSIXlt(Sys.time(), "GMT") # the current time in GMT
format(.leap.seconds)         # the leap seconds in your time zone
print(.leap.seconds, tz = "PST8PDT")  # and in Seattle's
## IGNORE_RDIFF_END

## look at *internal* representation of "POSIXlt" :
leapS <- as.POSIXlt(.leap.seconds)
names(unclass(leapS)) ; is.list(leapS)
## str() on inner structure needs unclass(.):
utils::str(unclass(leapS), vec.len = 7)
## show all (apart from "tzone" attr):
data.frame(unclass(leapS))

## Extracting *single* components of POSIXlt objects:
leapS[1 : 5, "year"]
leapS[17:22, "mon" ]

##  length(.) <- n   now works for "POSIXct" and "POSIXlt" :
for(lpS in list(.leap.seconds, leapS)) {
    ls <- lpS; length(ls) <- 12
    l2 <- lpS; length(l2) <- 5 + length(lpS)
    stopifnot(exprs = {
      ## length(.) <- * is compatible to subsetting/indexing:
      identical(ls, lpS[seq_along(ls)])
      identical(l2, lpS[seq_along(l2)])
      ## has filled with NA's
      is.na(l2[(length(lpS)+1):length(l2)])
    })
}

参考

Ripley, B. D. and Hornik, K. (2001). “Date-time classes.” R News, 1(2), 8-11. https://www.r-project.org/doc/Rnews/Rnews_2001-2.pdf.

也可以看看

Dates 适用于没有时间的日期。

as.POSIXctas.POSIXlt 用于类之间的转换。

strptime 用于与字符表示形式之间的转换。

Sys.time 将时钟时间作为 "POSIXct" 对象。

difftime 用于时间间隔。

balancePOSIXlt() 用于平衡或填充 “ragged” POSIXlt 对象。

cut.POSIXtseq.POSIXtround.POSIXttrunc.POSIXt 用于这些类的方法。

weekdays 方便提取函数。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Date-Time Classes。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。