下面列出了两行代码。两者对于白天和时间都是相同的,但只有一个有效。我正在使用R 3.1。
以下不起作用:
DateTime2=strftime("08/13/2010 05:26:24.350", format="%m/%d/%Y %H:%M:%OS", tz="GMT")
返回以下错误:
Error in as.POSIXlt.character(x, tz = tz) :
character string is not in a standard unambiguous format
但是以下工作:
DateTime2=strftime("08/02/2010 06:50:29.450", format="%m/%d/%Y %H:%M:%OS", tz="GMT")
第二行按预期存储DateTime2
。
有什么想法吗?
答案 0 :(得分:7)
使用strftime
时会发生什么?这是strftime
代码:
> strftime
function (x, format = "", tz = "", usetz = FALSE, ...)
format(as.POSIXlt(x, tz = tz), format = format, usetz = usetz,
...)
<bytecode: 0xb9a548c>
<environment: namespace:base>
使用参数as.POSIXlt
调用format
和THEN格式。
如果您在示例中直接调用as.POSIXlt
而未提供参数format
,则会发生以下情况:
> as.POSIXlt("08/13/2010 05:26:24.350", tz="GMT")
Error in as.POSIXlt.character("08/13/2010 05:26:24.350", tz = "GMT") :
character string is not in a standard unambiguous format
原因是as.POSIXlt
的代码如下:
> as.POSIXlt.character
function (x, tz = "", format, ...)
{
x <- unclass(x)
if (!missing(format)) {
res <- strptime(x, format, tz = tz)
if (nzchar(tz))
attr(res, "tzone") <- tz
return(res)
}
xx <- x[!is.na(x)]
if (!length(xx)) {
res <- strptime(x, "%Y/%m/%d")
if (nzchar(tz))
attr(res, "tzone") <- tz
return(res)
}
else if (all(!is.na(strptime(xx, f <- "%Y-%m-%d %H:%M:%OS",
tz = tz))) || all(!is.na(strptime(xx, f <- "%Y/%m/%d %H:%M:%OS",
tz = tz))) || all(!is.na(strptime(xx, f <- "%Y-%m-%d %H:%M",
tz = tz))) || all(!is.na(strptime(xx, f <- "%Y/%m/%d %H:%M",
tz = tz))) || all(!is.na(strptime(xx, f <- "%Y-%m-%d",
tz = tz))) || all(!is.na(strptime(xx, f <- "%Y/%m/%d",
tz = tz)))) {
res <- strptime(x, f, tz = tz)
if (nzchar(tz))
attr(res, "tzone") <- tz
return(res)
}
stop("character string is not in a standard unambiguous format")
}
<bytecode: 0xb9a4ff0>
<environment: namespace:base>
如果没有给出format
,它会尝试一系列通用格式,如果它们都不起作用,则会引发你得到的错误。
所有这一切的原因是strftime
(与strptime
相反,因此混淆)不用于将字符转换为POSIXlt对象,而是将POSIXlt对象转换为字符。在strftime
的帮助页面中:
值
格式方法和strftime返回表示的字符向量 时间。
要执行您想要执行的操作,请直接使用as.POSIXlt
,如下所示:
> as.POSIXlt("08/13/2010 05:26:24.350", tz="GMT", format="%m/%d/%Y %H:%M:%OS")
[1] "2010-08-13 05:26:24 GMT"
修改:仅供参考,您的第二行代码也无效:
strftime("08/02/2010 06:50:29.450", format="%m/%d/%Y %H:%M:%OS", tz="GMT")
[1] "02/20/0008 00:00:00"
答案 1 :(得分:1)
我认为你误解了strftime
的作用。其目的是将POSIXt
对象更改为字符向量。因此,您应该将POSIXt
个对象作为strftime
的参数。如果您给出一个字符向量,它会在格式化之前尝试转换为POSIXlt
。最重要的是format
参数不是输入字符串的格式,但它是您想要作为输出的格式。例如:
strftime(as.POSIXct("2014-10-20 12:14:50"), format = "%Y/%m")
#[1] "2014/10"
你的情况会怎样?由于您提供了字符向量,strftime
会尝试将其转换为POSIXlt
,假设您以某种标准格式提供日期。但是,当您以标准格式提供月份时,第一个字符串会显示13
。由于只有12个月,因此会发生错误。还要注意它如何转换第二个日期(这与它的意思非常不同)。