Har*_*nch 5 format parsing r posixct
考虑这个 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) )
Run Code Online (Sandbox Code Playgroud)
如果我将其粘贴到运行最新 (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
Run Code Online (Sandbox Code Playgroud)
请注意以 %OS3 结尾的时间格式如何生成正确的时间戳(3 位毫秒分辨率)。
但是,相同的时间格式无法将该时间戳解析回原始 POSIXct 值;它会呕吐并解析 NA。
有谁知道发生了什么?
网络搜索找到了这个 stackoverflow 链接,其中一位评论者 Waldir Leoncio 在第一个答案中似乎描述了与我所做的 %OS3 相同的解析错误:
“例如,使用 strptime(y, "%d.%m.%Y %H:%M:%OS3"),但它对我不起作用。Henrik 指出该函数的帮助页面,?strptime 指出%OS3 位依赖于操作系统。我使用的是更新的 Ubuntu 13.04,使用 %OS3 产生 NA。”
上面引用中提到的帮助页面可能是这个链接,不幸的是它很简洁,只是说
“特定于 R 的是 %OSn,它的输出将秒数截断为 0 <= n <= 6 个小数位(如果 %OS 后面没有数字,它使用 getOption("digits.secs") 的设置,或者如果未设置,则 n = 3。此外,对于 strptime %OS 将输入秒,包括小数秒。请注意,%S 忽略(而不是舍入)输出的小数部分。”
关于 strptime(即解析)的最后一句话是微妙的:它说“for strptime %OS”。请注意没有“n”:它表示 %OS 而不是 %OSn。
这是否意味着 %OSn 不能用于解析,只能用于格式化?
这就是我凭经验发现的,但它是预期的行为还是错误?
如果预期的行为非常烦人,因为这意味着我需要不同的时间格式来进行格式化和解析。以前从未在任何其他语言的日期 API 中看到过...
(旁白:我知道还有另一个问题,即使你只是想格式化,用 %OSn: R 截断小数部分而不是舍入。对于那些不知道这种不良行为的人,这里讨论了它的危害,这里,和在这里。)
这是预期行为,而不是错误。"%OSn"是为了输出。"%OS"用于输入,并包括小数秒,如第二个块引用中所述:
此外,for
strptime%OS将输入秒,包括秒的小数部分。
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"
Run Code Online (Sandbox Code Playgroud)
另请注意,这"EST"是一个不明确的时区,可能不是您所期望的。请参阅 的时区名称部分?timezone。
| 归档时间: |
|
| 查看次数: |
996 次 |
| 最近记录: |