在 R 中,%OSn 时间格式是否仅对格式化有效,但对解析无效?
In R, is the %OSn time format only valid for formatting, but not parsing?
考虑这个 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) )
如果我将它粘贴到我的 Windows 框中的 Rgui 中,这是 运行 最新的 (3.2.0) 稳定版本,我得到这个:
> 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 Whosebug 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 会截断小数部分而不是四舍五入。对于那些不知道这种不良行为的人, 讨论了它的危害 here, here, and here.)
这是预期的行为,不是错误。 "%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 代码,它使用定义的时间格式字符串(下面的 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) )
如果我将它粘贴到我的 Windows 框中的 Rgui 中,这是 运行 最新的 (3.2.0) 稳定版本,我得到这个:
> 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 Whosebug 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 会截断小数部分而不是四舍五入。对于那些不知道这种不良行为的人, 讨论了它的危害 here, here, and here.)
这是预期的行为,不是错误。 "%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
的 时区名称 部分。