如何将数据帧的字符列转换为Posixlt类型

时间:2012-04-28 23:40:43

标签: r

data.frame的一列是“character” 例如:2012年3月31日晚上9:56:53

/> class(columnName)  
[1] "character"

/>ttable[,c(3)] <- as.POSIXlt(ttable[,c(3)],tz="GMT", format="%H:%M:%S %p %m/%d/%Y")    

/>class(columnName)     
[1] "numeric"    

我希望它是posixlt,但事实证明它是数字。如何使它posixlt?

如果我对列的实际值应用相同的指令,它按预期工作?

/> dd <- as.POSIXlt("9:56:53 PM 3/31/2012",tz="GMT", format="%H:%M:%S %p %m/%d/%Y")  

/> class(dd)  
[1] "POSIXlt" "POSIXt" 

1 个答案:

答案 0 :(得分:3)

首先,让我们创建一些数据并复制您的问题。请注意警告,您没有提到:

ttable <- data.frame(x=1:2, y=1:2, z="9:56:53 PM 3/31/2012",
                     stringsAsFactors = FALSE)
ttable
#   x y                    z
# 1 1 1 9:56:53 PM 3/31/2012
# 2 2 2 9:56:53 PM 3/31/2012
ttable[, c(3)] <- as.POSIXlt(ttable[,c(3)], tz="GMT",
                                            format="%H:%M:%S %p %m/%d/%Y") 
# Warning message:
# In `[<-.data.frame`(`*tmp*`, , c(3), value = list(sec = c(53, 53 :
#   provided 9 variables to replace 1 variables
sapply(ttable, class)
#         x         y         z 
# "integer" "integer" "numeric" 

由于@joran将我们指向?DateTimeClasses,问题是as.POSIXlt返回长度为9(秒,分钟,小时等)的向量列表。无法分配此列表来代替ttable[,c(3)],因为其当前“宽度”为1.而是必须通过ttable[[3]]或{{1}重新分配整个data.frame列(或列表元素) }:

ttable$z

将列表指定为data.frame的列并不常见。这个类似的例子可能有所帮助:

ttable <- data.frame(x=1:2, y=1:2, z="9:56:53 PM 3/31/2012",
                     stringsAsFactors = FALSE)
ttable[[3]] <- as.POSIXlt(ttable[,c(3)], tz="GMT",
                                         format="%H:%M:%S %p %m/%d/%Y") 
sapply(ttable, class)
# $x
# [1] "integer"
# 
# $y
# [1] "integer"
# 
# $z
# [1] "POSIXlt" "POSIXt"