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


R as.POSIX* 日期时间转换函数


R语言 as.POSIX* 位于 base 包(package)。

说明

用于操作表示日历日期和时间的"POSIXlt""POSIXct" 类对象的函数。

用法

as.POSIXct(x, tz = "", ...)
as.POSIXlt(x, tz = "", ...)

## S3 method for class 'character'
as.POSIXlt(x, tz = "", format,
           tryFormats = c("%Y-%m-%d %H:%M:%OS",
                          "%Y/%m/%d %H:%M:%OS",
                          "%Y-%m-%d %H:%M",
                          "%Y/%m/%d %H:%M",
                          "%Y-%m-%d",
                          "%Y/%m/%d"),
           optional = FALSE, ...)
## Default S3 method:
as.POSIXlt(x, tz = "",
           optional = FALSE, ...)
## S3 method for class 'numeric'
as.POSIXlt(x, tz = "", origin, ...)

## S3 method for class 'Date'
as.POSIXct(x, tz = "UTC", ...)
## S3 method for class 'Date'
as.POSIXlt(x, tz = "UTC", ...)
## S3 method for class 'numeric'
as.POSIXct(x, tz = "", origin, ...)

## S3 method for class 'POSIXlt'
as.double(x, ...)

参数

x

R要转换的对象。

tz

一个字符串。用于转换的时区规范(如果需要)。系统特定(请参阅 time zones ),但 "" 是当前时区,"GMT" 是 UTC(协调世界时)。无效值通常被视为 UTC,在某些平台上会出现警告。

...

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

format

给出 strptime 使用的日期时间格式的字符串。

tryFormats

如果未指定 format,则要尝试的 character 向量 format 字符串。

optional

logical 表示如果格式猜测不成功,则返回 NA(而不是发出错误信号)。

origin

日期时间对象,或者可以被强制的东西as.POSIXct(tz = "GMT")对于这样的一个物体。可选自R4.3.0,相当于"1970-01-01"被使用。

细节

as.POSIX* 函数将对象转换为用于表示日期/时间的两个类之一(日历日期加上精确到秒的时间)。他们可以将其他类和"Date" 类的对象转换为这些类。没有时间的日期被视为 UTC 午夜。

它们还可以转换 "2001-02-03""2001/02/03" 格式的字符串(可选后跟空格和时间),格式为 "14:52""14:52:03" 。 (诸如 "01/02/03" 之类的格式不明确,但可以通过 strptime 的格式规范进行转换。)允许使用小数秒。或者,可以为字符向量或因子指定 format:如果未指定并且没有标准格式适用于所有非 NA 输入,则会引发错误。

如果指定了 format,请记住某些格式规范是 locale-specific,并且您可能需要通过 Sys.setlocale 适当设置 LC_TIME 类别。这通常会影响 %a%A (工作日名称)、 %b%B (月份名称)和 %p (上午/下午)的使用。

逻辑 NA 可以转换为任一类,但不能转换为其他逻辑向量。

如果给您一个数字时间作为自纪元以来的秒数,请参阅示例。

字符输入首先由 strptime 转换为类 "POSIXlt" :数字输入首先转换为 "POSIXct" 。需要在两个日期时间类之间进行的任何转换都需要时区:从 "POSIXlt""POSIXct" 的转换将验证所选时区中的时间。一个问题是夏令时转换时会发生什么,例如在英国

as.POSIXct(strptime("2011-03-27 01:30:00", "%Y-%m-%d %H:%M:%S"))
as.POSIXct(strptime("2010-10-31 01:30:00", "%Y-%m-%d %H:%M:%S"))

分别是无效(时钟在 1:00 GMT 前进到 2:00 BST)和不明确(时钟在 2:00 BST 向后退到 1:00 GMT)。在这种情况下发生的情况是特定于操作系统的:人们应该期望第一个是 NA ,但第二个可以解释为 BST 或 GMT (常见操作系统给出这两种可能的值)。另请注意(请参阅strftime),操作系统工具可能无法正确格式化无效时间。

as.POSIXctas.POSIXlt 返回相应类的对象。如果指定了tzas.POSIXlt 将给出适当的"tzone" 属性。已知无效的 Date-times 将作为 NA 返回。

注意

使用的一些概念必须向后延伸(据说用法是‘proleptic’)。例如,"POSIXct" 类的时间原点“1970-01-01 00:00.00 UTC”是在定义 UTC 之前。更重要的是,转换是假设 1582 年引入的公历进行的,直到 20 世纪才使用near-universally。 ISO 8601:2004 假设的重新解释之一是存在零年,尽管当前年份编号(和零)是一个较晚的概念(525 CE 表示从 1 CE 开始的年份编号)。

未来时间的 "POSIXlt""POSIXct" 之间的转换是推测性的(UTC 除外)。主要的不确定性在于 DST 的使用和转换(大多数系统将假定当前规则的延续,但这些规则可能会在短时间内更改)。

如果您想提取时间的特定方面(例如星期几),只需将其转换为类 "POSIXlt" 并提取列表的相关组件,或者如果您想要字符表示(例如命名的星期几)使用 format 方法。

如果需要时区并且指定的时区在您的系统上无效,则发生的情况是特定于系统的,但尝试设置它可能会被忽略。

从字符转换需要找到一种合适的格式,除非提供了一种格式(通过依次尝试通用格式):对于长输入来说,这可能会很慢。

例子


(z <- Sys.time())             # the current datetime, as class "POSIXct"
unclass(z)                    # a large integer
floor(unclass(z)/86400)       # the number of days since 1970-01-01 (UTC)
(now <- as.POSIXlt(Sys.time())) # the current datetime, as class "POSIXlt"
str(unclass(now))             # the internal list ; use now$hour, etc :
now$year + 1900               # see ?DateTimeClasses
months(now); weekdays(now)    # see ?months; using LC_TIME locale

## suppose we have a time in seconds since 1960-01-01 00:00:00 GMT
## (the origin used by SAS)
z <- 1472562988
# ways to convert this
as.POSIXct(z, origin = "1960-01-01")                # local
as.POSIXct(z, origin = "1960-01-01", tz = "GMT")    # in UTC

## SPSS dates (R-help 2006-02-16)
z <- c(10485849600, 10477641600, 10561104000, 10562745600)
as.Date(as.POSIXct(z, origin = "1582-10-14", tz = "GMT"))

## Stata date-times: milliseconds since 1960-01-01 00:00:00 GMT
## format %tc excludes leap-seconds, assumed here
## For format %tC including leap seconds, see foreign::read.dta()
z <- 1579598122120
op <- options(digits.secs = 3)
# avoid rounding down: milliseconds are not exactly representable
as.POSIXct((z+0.1)/1000, origin = "1960-01-01")
options(op)

## Matlab 'serial day number' (days and fractional days)
z <- 7.343736909722223e5 # 2010-08-23 16:35:00
as.POSIXct((z - 719529)*86400, origin = "1970-01-01", tz = "UTC")

as.POSIXlt(Sys.time(), "GMT") # the current time in UTC

## These may not be correct names on your system
as.POSIXlt(Sys.time(), "America/New_York")  # in New York
as.POSIXlt(Sys.time(), "EST5EDT")           # alternative.
as.POSIXlt(Sys.time(), "EST" )   # somewhere in Eastern Canada
as.POSIXlt(Sys.time(), "HST")    # in Hawaii
as.POSIXlt(Sys.time(), "Australia/Darwin")


tab <- file.path(R.home("share"), "zoneinfo", "zone1970.tab")
if(file.exists(tab)) { # typically on Windows; *not* on Linux
  cols <- c("code", "coordinates", "TZ", "comments")
  tmp <- read.delim(tab,
                    header = FALSE, comment.char = "#", col.names = cols)
  if(interactive()) View(tmp)
  head(tmp, 10)
}

也可以看看

DateTimeClasses了解课程详情; strptime 用于与字符表示形式之间的转换。

Sys.timezone 了解时区(系统特定)命名的详细信息。

locales 用于locale-specific 方面。

相关用法


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