首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R strftime()行为

R strftime()行为
EN

Stack Overflow用户
提问于 2014-08-14 03:25:53
回答 2查看 10.9K关注 0票数 4

下面列出了两行代码。两种方法对一天和一天的期望是相同的,但只有一种是可行的。我正在使用R 3.1。

以下内容不起作用:

代码语言:javascript
复制
DateTime2=strftime("08/13/2010 05:26:24.350", format="%m/%d/%Y %H:%M:%OS", tz="GMT")

返回以下错误:

代码语言:javascript
复制
Error in as.POSIXlt.character(x, tz = tz) : 
  character string is not in a standard unambiguous format

但以下工作:

代码语言:javascript
复制
DateTime2=strftime("08/02/2010 06:50:29.450", format="%m/%d/%Y %H:%M:%OS", tz="GMT")

第二行按预期存储DateTime2

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2014-10-21 07:57:24

当您使用strftime时会发生什么?以下是strftime代码:

代码语言:javascript
复制
> 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,则会发生以下情况:

代码语言:javascript
复制
> 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的代码如下:

代码语言:javascript
复制
> 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,如下所示:

代码语言:javascript
复制
> 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"

编辑: FYI --你是第二行代码--也没有工作:

代码语言:javascript
复制
strftime("08/02/2010 06:50:29.450", format="%m/%d/%Y %H:%M:%OS", tz="GMT")
[1] "02/20/0008 00:00:00"
票数 7
EN

Stack Overflow用户

发布于 2014-10-21 08:14:27

我想你误解了strftime的工作。它的目的是将POSIXt对象更改为字符向量。因此,您应该将POSIXt对象作为参数给strftime。如果您给出一个字符向量,它将尝试在格式化它之前将其转换为POSIXlt。最重要的是,format参数不是输入字符串的格式,而是您希望作为输出的格式。例如:

代码语言:javascript
复制
strftime(as.POSIXct("2014-10-20 12:14:50"), format = "%Y/%m")
#[1] "2014/10"

你的案子发生了什么?由于您提供的是字符向量,如果您以某种标准格式给出了日期,strftime会尝试将其转换为一个POSIXlt。但是,当以标准格式提供月份时,第一个字符串将显示一个13。因为只有12个月,所以会发生错误。还请注意,它如何转换第二个日期(这是非常不同的,它应该是什么意思)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25299544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档