我有个约会。
这是一个示例(由 mydate <- lubridate::now()
生成):
mydate <- structure(1361998255.23362, class = c("POSIXct", "POSIXt"), tzone = "")
如果我把它放在一个向量中,它看起来还不错:
(根据@joran 的评论,我将最初使用 as.character
的示例缩减为仅使用 c
。现在我提供两种情况)
> c(mydate)
[1] "2013-02-27 14:50:55 CST"
> as.character(mydate)
[1] "2013-02-27 14:50:55"
但是,如果我尝试将它与另一个字符元素结合使用,则会剥离日期时间格式:
> c('a', mydate)
[1] "a" "1361998255.23362"
> as.character('a', mydate)
[1] "a" "1361998255.23362"
在这两种情况下,输出都是“字符”类
为什么 c
根据输入向量的内容提供不同的结果?正在添加 as.character(mydate)
一个合适的解决方案?
> c('a', as.character(mydate))
[1] "a" "2013-02-27 14:50:55"
唯一的缺点:如果我输入一个包含五个日期的向量,我宁愿不必写五次 as.character。
context: 以上是一个最小的可重现示例。上下文是我将一个向量传递给一个函数,该函数将一个向量转换为一个逗号分隔的字符串,以便编写 sql 语句:function(x) paste(paste("'", x, "'", sep=''), collapse=',')
最佳答案
in both cases, the output is of class "character"
这是不对的
> class(c(mydate))
[1] "POSIXct" "POSIXt"
> dput(c(mydate))
structure(1361998255.23362, class = c("POSIXct", "POSIXt"))
c(mydate)
仍然是一个 POSIXt
对象。打印时,它看起来像一个字符,但它不是一个字符。 c
对 POSIXt
对象有这种行为,因为有一个专门的 c.POSIXct
函数。
在第二种情况下,第一个参数是一个字符,所以它默认为 c
的(内部)版本。这做了两件事:它去除了除名称之外的属性,并将提升到可以表示所有元素的类型(参见 c
的帮助页面)。剥离 mydate
的属性给出
> as.vector(mydate)
[1] 1361998255
将数字提升为字符给出
> as.character(as.vector(mydate))
[1] "1361998255.23362"
这个字符串现在与 "a"
连接,得到你看到的结果。
> c('a', mydate)
[1] "a" "1361998255.23362"
关于多个 as.character()
调用以在正确的时间获得强制,您可以使用 c
将所有日期包装在一起(它使用 c .POSIXct
) 和调用 as.character
> c('a', as.character(c(mydate, mydate)))
[1] "a" "2013-02-27 12:50:55" "2013-02-27 12:50:55"
关于as.character 的结果取决于向量内容(re : pasting a POSIX date-time),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122461/