当你使用
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
进行格式化。
如果您直接在示例中调用
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
,它会尝试一系列常见格式,如果没有一个有效,则会引发您得到的错误。
所有这些的原因是,与
strptime
相反,
strftime
不用于将字符转换为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"