输出规格为%Z
(参见?strptime
)。但是对于输入,它是如何工作的呢?
澄清一下,时区缩写被as.POSIXct()
解析成有用的信息是很好的,但更核心的问题是如何让函数至少忽略时区。
这是我最好的解决方案,但是是否有一个特定的格式代码传递给as.POSIXct()
,将适用于所有时区?
times <- c("Fri Jul 03 00:15:00 EDT 2015", "Fri Jul 03 00:15:00 GMT 2015")
as.POSIXct(times, format="%a %b %d %H:%M:%S %Z %Y") # nope! strptime can't handle %Z in input
formats <- paste("%a %b %d %H:%M:%S", gsub(".+ ([A-Z]{3}) [0-9]{4}$", "\1", times),"%Y")
as.POSIXct(times, format=formats) # works
编辑:这是最后一行的输出,以及它的类(来自一个单独的调用);输出与预期一致。从控制台中:
> as.POSIXct(times, format=formats)
[1] "2015-07-03 00:15:00 EDT" "2015-07-03 00:15:00 EDT"
> attributes(as.POSIXct(times, format=formats))
$class
[1] "POSIXct" "POSIXt"
$tzone
[1] ""
简短的回答是:"不,你不能。"这些都是缩写,它们不能保证唯一地标识特定的时区。
例如,"EST"是美国还是澳大利亚的东部标准时间?"CST"是美国或澳大利亚的中央标准时间,还是中国标准时间,还是古巴标准时间?
我刚刚注意到你没有试图解析时区缩写,你只是试图避免它。我不知道如何告诉strptime
忽略任意字符。我知道它会忽略格式字符串结束后的时间字符表示中的任何内容。例如:
R> # The year is not parsed, so the current year is used
R> as.POSIXct(times, format="%a %b %d %H:%M:%S")
[1] "2015-07-03 00:15:00 UTC" "2015-07-03 00:15:00 UTC"
除此之外,正则表达式是我能想到的解决这个问题的唯一方法。与您的示例不同,我将在输入字符向量上使用正则表达式来删除所有3-5个字符的时区缩写。
R> times_no_tz <- gsub(" [[:upper:]]{3,5} ", " ", times)
R> as.POSIXct(times_no_tz, format="%a %b %d %H:%M:%S %Y")
[1] "2015-07-03 00:15:00 UTC" "2015-07-03 00:15:00 UTC"