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


R strptime 与字符之间的日期时间转换函数


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

说明

在字符表示和表示日历日期和时间的 "POSIXlt""POSIXct" 类的对象之间进行转换的函数。

用法

## S3 method for class 'POSIXct'
format(x, format = "", tz = "", usetz = FALSE, ...)
## S3 method for class 'POSIXlt'
format(x, format = "", usetz = FALSE,
       digits = getOption("digits.secs"), ...)

## S3 method for class 'POSIXt'
as.character(x, digits = if(inherits(x, "POSIXlt")) 14L else 6L,
             OutDec = ".", ...)

strftime(x, format = "", tz = "", usetz = FALSE, ...)
strptime(x, format, tz = "")

参数

x

要转换的对象: strptime 的字符向量,可以转换为 strftime"POSIXlt" 的对象。

tz

指定用于转换的时区的字符串。系统特定(请参阅 as.POSIXlt ),但 "" 是当前时区,"GMT" 是 UTC。无效值通常被视为 UTC,在某些平台上会出现警告。

format

一个字符串。如果任何元素具有非午夜的时间分量,则 format 方法的默认值为 "%Y-%m-%d %H:%M:%S",否则为 "%Y-%m-%d"。如果设置了options("digits.secs"),则将在几秒内打印指定的位数。

...

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

usetz

合乎逻辑的。时区缩写是否应该附加到输出中?这是在打印时使用的,比使用 "%Z" 更可靠。

digits

需要时确定秒数的 format() 整数。请注意,format()as.character() 的默认值有意不同,as.character() 与数字一样接近完全准确。

OutDec

指定要使用的小数点的 1 个字符的字符串;默认值不是故意的getOption("OutDec")

细节

formatas.character 方法以及 strftime 将对象从类 "POSIXlt""POSIXct" 转换为 character 向量。

strptime 将字符向量转换为类 "POSIXlt" :其输入 x 首先由 as.character 转换。每个输入字符串都会根据指定的格式进行必要的处理:任何尾随字符都会被忽略。

strftime是一个包装器format.POSIXlt,并且它和format.POSIXct首先转换为类"POSIXlt"通过调用as.POSIXlt(所以他们也为类工作"Date")。请注意,只有该转换取决于时区。自从R版本4.2.0,as.POSIXlt()转换现在处理非有限数字-Inf,Inf,NANaN不同的是(以前所有的都被视为NA)。还有format()方法用于POSIXlt现在将这些不同的非有限时间和日期视为类似于类型double.

通常的向量回收规则适用于 xformat,因此答案将是这些向量中较长者的长度。

在适当且可用的情况下使用 Locale-specific 与字符串之间的转换。这会影响日期和月份的名称、AM/PM 指示器(如果使用)以及输出格式中的分隔符,例如%x%X,通过的设置LC_TIME语言环境类别。说明的“当前区域设置”可能意味着在开始时使用的区域设置R会话或首次使用这些函数时。 (对于输入,locale-specific 转换可以通过调用来更改Sys.setlocale有类别LC_TIME(或者LC_ALL)。对于输出,发生的情况取决于操作系统,但通常有效。)

格式的详细信息是特定于平台的,但以下内容可能会广泛使用:大多数是由 POSIX 标准定义的。转换规范由 % 引入,通常后跟一个字母或 OE 后跟一个字母。格式字符串中不属于转换规范的任何字符均按字面解释(并且 %% 给出 % )。广泛实施的转换规范包括

%a

该平台当前区域设置中工作日的缩写名称。 (还匹配输入的全名:在某些语言环境中没有名称缩写。)

%A

当前区域设置中的完整工作日名称。 (也匹配输入上的缩写名称。)

%b

该平台当前区域设置中月份名称的缩写。 (还匹配输入的全名:在某些语言环境中没有名称缩写。)

%B

当前区域设置中的完整月份名称。 (也匹配输入上的缩写名称。)

%c

日期和时间。输出为Locale-specific,输入为"%a %b %e %H:%M:%S %Y"

%C

世纪(00-99):年份的整数部分除以100。

%d

十进制数形式的月份日期 (01-31)。

%D

日期格式,例如 %m/%d/%y :C99 标准表示它应该是这种确切的格式(但并非所有操作系统都遵守)。

%e

十进制数 (1-31) 表示的月份中的日期,前导空格表示 single-digit 数字。

%F

相当于 %Y-%m-%d(ISO 8601 日期格式)。

%g

基于周的年份的最后两位数字(请参阅 %V )。 (已接受但在输入时被忽略。)

%G

以周为单位的年份(请参阅 %V )为十进制数。 (已接受但在输入时被忽略。)

%h

等效于 %b

%H

十进制数形式的小时 (00-23)。作为特殊的异常字符串,例如‘⁠24:00:00⁠’ 被接受作为输入,因为 ISO 8601 允许这些。

%I

十进制数形式的小时 (01-12)。

%j

十进制数形式的一年中的日期 (001-366): 对于输入,366 仅在闰年有效。

%m

十进制数形式的月份 (01-12)。

%M

分钟为十进制数 (00-59)。

%n

输出换行,输入任意空格。

%p

区域设置中的 AM/PM 指示器。与 %I 结合使用,而不是与 %H 结合使用。某些语言环境中的空字符串(例如,在某些操作系统、包括俄罗斯在内的非英语欧洲语言环境中)。如果用于此类区域设置中的输入,则行为未定义。

某些平台接受 %P 进行输出,它使用小写版本( %p 也可能使用小写):其他平台将输出 P

%r

对于输出,12 小时时钟时间(使用区域设置的 AM 或 PM):仅在某些区域设置中定义,并且在未定义 AM/PM 指示符的区域设置中的某些操作系统上会产生误导。对于输入,相当于 %I:%M:%S %p

%R

等效于 %H:%M

%S

第二个为整数 (00-61),最多允许两个 leap-seconds(但 POSIX-compliant 实现将忽略闰秒)。

%t

输出上使用制表符,输入上使用任意空格。

%T

等效于 %H:%M:%S

%u

十进制数形式的工作日(1-7,星期一为 1)。

%U

一年中的第几周,以十进制数 (00-53) 表示,使用星期日作为一周的第一天(通常将一年中的第一个星期日作为第一周的第一天)。美国大会。

%V

一年中的第几周,采用 ISO 8601 中定义的十进制数 (01-53)。如果包含 1 月 1 日的周(从星期一开始)在新的一年中有四天或更多天,则将其视为第 1 周。否则,将其视为第 1 周。上一年的最后一周,下一周是第一周。(接受但忽略输入。)

%w

工作日为十进制数(0-6,星期日为 0)。

%W

一年中的第几周,以十进制数 (00-53) 表示,使用星期一作为一周的第一天(通常将一年中的第一个星期一作为第一周的第一天)。英国大会。

%x

日期。输出为Locale-specific,输入为"%y/%m/%d"

%X

时间。输出为Locale-specific,输入为"%H:%M:%S"

%y

无世纪的年份 (00-99)。输入时,值 00 到 68 以 20 为前缀,69 到 99 以 19 为前缀 - 这是 2018 POSIX 标准指定的行为,但它也表示“预计在未来版本中,默认世纪从 2 推断” -数字年份将会改变'。

%Y

年与世纪。请注意,虽然原始公历中没有零,但 ISO 8601:2004 将其定义为有效(解释为 1BC):请参阅 https://en.wikipedia.org/wiki/0_(year) 。然而,该标准还规定,其历法中1582年之前的年份只能在相关各方同意的情况下使用。

对于输入,仅接受年份0:9999

%z

与 UTC 的小时和分钟的有符号偏移量,所以-0800比 UTC 晚 8 小时。 (标准仅适用于输出。适用于输入R目前在所有平台上都支持它 - 值来自-1400+1400被接受。)

%Z

(仅输出。)时区缩写为字符串(如果不可用则为空)。当时区缩写多年来发生变化时,这可能不可靠。

显示前导零的地方将在输出中使用,但在输入中是可选的。名称在输入时匹配 case-insensitively:输出时名称是否大写取决于平台和区域设置。请注意,缩写名称是特定于平台的(尽管标准在‘⁠C⁠' 语言环境 它们必须是大写英文名称的前三个字母:此约定广泛用于 English-language 语言环境,但例如法语月份缩写在 Linux、macOS、Solaris 和 Windows 中的任何两个上都不相同)。如果您想使用缩写,那么了解缩写至关重要%a,%b或者%h作为输入格式的一部分:请参阅示例以了解如何检查。

%z%Z 用于具有指定时区的对象的输出时,系统会尝试使用该时区的值 — 但不保证成功。

%n%t 的 ‘whitespace’ 的定义取决于平台:对于大多数来说,它不包含不间断空格。

不在标准中且实施较少的是

%k

24 小时制时间,单位数字前面有一个空格。

%l

12 小时制时间,单位数字前面有一个空格。

%s

(仅限输出。)自纪元以来的秒数。

%+

(仅输出。)类似于 %c ,通常是 "%a %b %e %H:%M:%S %Z %Y" 。可能取决于区域设置。

对于输出,还有%O[dHImMUVwWy],它可以以替代的locale-dependent格式(例如,罗马数字)发出数字,以及%E[cCyYxX],它可以使用替代的‘era’(例如,不同的宗教日历)。其中受支持的是OS-dependent。这些被接受作为输入,但具有标准解释。

具体到R%OSn,对于输出,将秒数截断为0 <= n <= 6小数位(如果%OS后面没有数字,它使用的设置getOption("digits.secs"),或者如果未设置,n = 0)。进一步地,对于strptime %OS将输入秒,包括秒的小数部分。注意%S不读取输出的小数部分。

其他转换规范的行为(即使以 % 开头的其他字符序列是转换规范)是特定于系统的。某些系统记录不支持在 format 中使用多字节字符:UTF-8 语言环境不太可能导致问题。

format 方法和 strftime 返回表示时间的字符向量。 NA 时间返回为 NA_character_

strptime将字符表示形式转换为类的对象"POSIXlt"。时区用于设置isdst组件并设置"tzone"属性如果tz != ""。如果指定的时间无效(例如‘⁠“2010-02-30 08:00”⁠’)结果的所有组成部分都是NA。 (注意:这确实意味着它所说的 - 如果它是一个无效时间,而不仅仅是某个时区中不存在的时间。)

印刷年限

每个人都同意从 1000 到 9999 的年份应该用 4 位数字打印,但标准没有定义在该范围之外要做什么。对于 0 到 999 年,大多数操作系统都会用零或空格填充 4 个字符,但 Linux/glibc 只输出数字。

操作系统设施可能不会打印 1 CE(又名 1 AD)之前的年份‘correctly’(它们倾向于假设存在 0 年:请参阅https://en.wikipedia.org/wiki/0_(year),有些操作系统完全错误)。常见格式为 -45-045

9999之后和-999之前的年份通常打印有五个或更多字符。

某些平台支持 POSIX 2008(及其他平台)的修饰符。在 Linux/glibc 上的格式"%04Y"确保至少四个字符和零填充(默认为无填充)。内部代码(在 Windows 上使用,在 macOS 上默认使用)默认使用零填充(这可以通过环境变量控制)R_PAD_YEARS_BY_ZERO)。在这些平台上,格式%04Y,%_4Y%_Y可分别用于零、空格和无填充。 (在 macOS 上,本机代码(非默认)不支持这些,并使用零填充到 4 位数字。)

时区偏移

与 GMT(也称为 UTC)的偏移是时区之间以及与 "POSIXct" 类之间转换的一部分,但会造成困难,因为它们通常计算不正确。

它们通常具有与时区规范相反的符号(请参阅Sys.timezone):正值位于子午线以东。尽管有些时区存在偏移量,如 +00:09:21(1900 年的巴黎)和 -00:44:30(利比里亚,直到 1972 年),但偏移量通常被视为整数分钟,并且最常见于RFC 5322 电子邮件标头采用 -0800 等形式(例如,冬季在美国太平洋海岸使用)。

格式 %z 可用于输入或输出:它是一个字符串,通常是加号或减号,后跟两位数字表示小时,两位数字表示分钟:标准规定,如果偏移量不确定,则应输出空字符串,但是某些系统使用 +0000 或当年使用的时区的偏移量。 (在某些平台上,转换为 "POSIXct" 后效果更好。某些平台仅识别小时或 half-hour 输出偏移量。)

使用 %z 作为输入对于 tz = "UTC" 最有意义。

来源

输入使用 POSIX 函数 strptime 并输出 C99 函数 strftime

然而,并非所有操作系统(尤其是 Windows)都提供strptime那些这样做的人发现了很多问题,所以自 2000 年以来R使用了来自‘的代码分支⁠glibc⁠’。分叉的代码使用系统的strftime查找 locale-specific 日期和月份名称以及任何 AM/PM 指示器。

在某些平台上(包括 Windows,默认情况下在 macOS 上)系统的strftime被 IANA 修改的代码替换(以及 C-level 日期时间代码的大部分其余部分)⁠tzcode⁠' 分配 (https://www.iana.org/time-zones)。

请注意,由于 strftime 用于输出(而不是 wcsftime ),因此如果需要将参数 format 转换为会话编码。

注意

默认格式遵循 ISO 8601 国际标准的规则,该标准将一天表示为"2001-02-28"和一个时间"14:01:02"像这里一样使用前导零。 (ISO 形式不使用空格,可能是‘⁠T⁠’,分隔日期和时间:R默认情况下使用空格。)

对于strptime,输入字符串不需要完全指定日期:假设未指定的秒、分钟或小时为零,未指定的年、月或日为当前。 (但是,如果指定了月份,则该月的日期必须由 %d%e 指定,因为该月的当前日期不必对于指定的月份有效。)某些组件可能会返回为 NA(但未知的tzone组件由空字符串表示)。

如果指定的时区在您的系统上无效,则发生的情况是特定于系统的,但可能会被忽略。

请记住,在大多数时区,由于与“夏令时”(也称为‘summer’)时间的转换,有些时间不会发生,有些时间会发生两次。 strptime 不会验证此类时间(它不假定特定时区),但 as.POSIXct 的转换会验证此类时间。 strftime 的转换和格式化/打印使用操作系统设施,并且可能会在 DST 转换时返回不存在的时间的无意义结果。

在 C 语言环境中%c必须是"%a %b %e %H:%M:%S %Y"。由于 Windows 不符合规定(并且使用北美以外地区无法理解的日期格式),因此该格式被使用R在 Windows 上的所有语言环境中。

生成的每个字符串的长度限制为 2048 个字节strftimeformat方法。来自R4.3.0 尝试超过此值是一个错误(以前的版本会默默地截断为 255 字节)。

例子


## locale-specific version of date()
format(Sys.time(), "%a %b %d %X %Y %Z")

## time to sub-second accuracy (if supported by the OS)
format(Sys.time(), "%H:%M:%OS3")

## read in date info in format 'ddmmmyyyy'
## This will give NA(s) in some non-English locales; setting the C locale
## as in the commented lines will overcome this on most systems.
## lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
z <- strptime(x, "%d%b%Y")
## Sys.setlocale("LC_TIME", lct)
z
(chz <- as.character(z)) # same w/o TZ
## *here* (but not in general), the same as format():
stopifnot(exprs = {
     identical(chz, format(z))
     grepl("^1960-0[137]-[03][012]$", chz[!is.na(z)])
})

## read in date/time info in format 'm/d/y h:m:s'
dates <- c("02/27/92", "02/27/92", "01/14/92", "02/28/92", "02/01/92")
times <- c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26")
x <- paste(dates, times)
z2 <- strptime(x, "%m/%d/%y %H:%M:%S")
z2 
## *here* (but not in general), the same as format():
stopifnot(identical(format(z2), as.character(z2)))

## time with fractional seconds
z3 <- strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS") 
z3 # prints without fractional seconds by default, digits.sec = NULL ("= 0")
op <- options(digits.secs = 3)
z3 # shows the 3 extra digits
as.character(z3) # ditto
options(op)

## time zone names are not portable, but 'EST5EDT' comes pretty close.
z4 <- strptime(c("2006-01-08 10:07:52", "2006-08-07 19:33:02"),
               "%Y-%m-%d %H:%M:%S", tz = "EST5EDT")
z4 
attr(z4, "tzone")
as.character(z4)
z4$sec[2] <- pi # "very" fractional seconds
as.character(z4) # shows full precision
format(z4) # no fractional sec
format(z4, digits=8) # shows only 6  (hard-wired maximum)
format(z4, digits=4)


## An RFC 5322 header (Eastern Canada, during DST)
## In a non-English locale the commented lines may be needed.

## prev <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
strptime("Tue, 23 Mar 2010 14:36:38 -0400", "%a, %d %b %Y %H:%M:%S %z")
## Sys.setlocale("LC_TIME", prev)

## Make sure you know what the abbreviated names are for you if you wish
## to use them for input (they are matched case-insensitively):
format(s1 <- seq.Date(as.Date('1978-01-01'), by = 'day',   len =  7), "%a")
format(s2 <- seq.Date(as.Date('2000-01-01'), by = 'month', len = 12), "%b")

## Non-finite date-times :
format(as.POSIXct(Inf)) # "Inf"  (was  NA  in R <= 4.1.x)
format(as.POSIXlt(c(-Inf,Inf,NaN,NA))) # were all NA

参考

International Organization for Standardization (2004, 2000, ...) ‘ISO 8601. Data elements and interchange formats - Information interchange - Representation of dates and times.’, slightly updated to International Organization for Standardization (2019) ‘ISO 8601-1:2019. Date and time - Representations for information interchange - Part 1: Basic rules’, and further amended in 2022. For links to versions available on-line see (at the time of writing) https://dotat.at/tmp/ISO_8601-2004_E.pdf and https://www.qsl.net/g1smd/isopdf.htm; for information on the current official version, see https://www.iso.org/iso/iso8601 and https://en.wikipedia.org/wiki/ISO_8601.

The POSIX 1003.1 standard, which is in some respects stricter than ISO 8601.

也可以看看

DateTimeClasses 了解日期时间类的详细信息; locales 查询或设置区域设置。

您的系统帮助页面strftime 可以查看如何指定其格式。 (在某些系统上,包括 Windows,strftime 被更全面的内部代码取代。)

相关用法


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