gpt4 book ai didi

r - 在 R 中,%OSn 时间格式是否仅对格式化有效,但对解析无效?

转载 作者:行者123 更新时间:2023-12-03 17:06:38 26 4
gpt4 key购买 nike

考虑这个 R 代码,它使用定义的时间格式字符串(下面的 timeFormat 变量)来格式化和解析日期:


time = as.POSIXct(1433867059, origin = "1970-01-01")
print(time)
print( as.numeric(time) )

timeFormat = "%Y-%m-%d %H:%M:%OS3"
tz = "EST"

timestamp = format(time, format = timeFormat, tz = tz)
print(timestamp)

timeParsed = as.POSIXct(timestamp, format = timeFormat, tz = tz)
print(timeParsed)
print( as.numeric(timeParsed) )

如果我将其粘贴到运行最新 (3.2.0) 稳定版本的 Windows 机器上的 Rgui 中,我会得到以下信息:

> time = as.POSIXct(1433867059, origin = "1970-01-01")
> print(time)
[1] "2015-06-09 12:24:19 EDT"
> print( as.numeric(time) )
[1] 1433867059
>
> timeFormat = "%Y-%m-%d %H:%M:%OS3"
> tz = "EST"
>
> timestamp = format(time, format = timeFormat, tz = tz)
> print(timestamp)
[1] "2015-06-09 11:24:19.000"
>
> timeParsed = as.POSIXct(timestamp, format = timeFormat, tz = tz)
> print(timeParsed)
[1] NA
> print( as.numeric(timeParsed) )
[1] NA

请注意以 %OS3 结尾的时间格式如何生成正确的时间戳(3 位毫秒分辨率)。

但是,相同的时间格式无法将该时间戳解析回原始 POSIXct 值;它会呕吐并解析 NA。

有谁知道发生了什么?

网络搜索发现 this stackoverflow link
其中一位评论者 Waldir Leoncio 在第一个答案中似乎描述了与我相同的 %OS3 解析错误:

"use, for example, strptime(y, "%d.%m.%Y %H:%M:%OS3"), but it doesn't work for me. Henrik noted that the function's help page, ?strptime states that the %OS3 bit is OS-dependent. I'm using an updated Ubuntu 13.04 and using %OS3 yields NA."



上面引用中提到的帮助页面可能是 this link
不幸的是,这很简洁,只是说

"Specific to R is %OSn, which for output gives the seconds truncated to 0 <= n <= 6 decimal places (and if %OS is not followed by a digit, it uses the setting of getOption("digits.secs"), or if that is unset, n = 3). Further, for strptime %OS will input seconds including fractional seconds. Note that %S ignores (and not rounds) fractional parts on output."



关于 strptime(即解析)的最后一句话是微妙的:它说“for strptime %OS”。请注意没有“n”:它表示 %OS 而不是 %OSn。

这是否意味着 %OSn 不能用于解析,只能用于格式化?

这就是我凭经验发现的,但它是预期的行为还是错误?

如果预期的行为非常烦人,因为这意味着我需要不同的时间格式来进行格式化和解析。以前从未在任何其他语言的日期 API 中看到过...

(旁白:我知道还有另一个问题,即使你只是想格式化,用 %OSn: R 截断小数部分而不是舍入。对于那些不知道这种不良行为的人,讨论其危害 hereherehere .)

最佳答案

这是预期的行为,而不是错误。 "%OSn"用于输出。 "%OS"用于输入,包括小数秒,正如您在第二个块引用中所说:

Further, for strptime %OS will input seconds including fractional seconds.


options(digits.secs=6)
as.POSIXct("2015-06-09 11:24:19.002", "America/New_York", "%Y-%m-%d %H:%M:%OS")
# [1] "2015-06-09 11:24:19.002 EDT"

另请注意 "EST"是一个模棱两可的时区,可能不是您所期望的。请参阅 ?timezone 的时区名称部分.

关于r - 在 R 中,%OSn 时间格式是否仅对格式化有效,但对解析无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31006204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com