去年,我使用下面的代码将字符串转换为日期时间并且它有效,但现在我在运行strptime
后得到了意想不到的结果。
Data <- structure(list(time = c("12:00 AM", "1:00 AM", "2:00 AM",
"3:00 AM", "4:00 AM", "5:00 AM", "6:00 AM", "7:00 AM", "8:00 AM",
"9:00 AM", "10:00 AM", "11:00 AM")),
.Names = "time", class = "data.frame", row.names = c(NA, -12L))
为什么这给了我来自strptime的预期结果:
strptime(Data$time[1:10], format="%l:%M %p")
# [1] "2013-03-01 00:00:00" "2013-03-01 01:00:00" "2013-03-01 02:00:00"
# [4] "2013-03-01 03:00:00" "2013-03-01 04:00:00" "2013-03-01 05:00:00"
# [7] "2013-03-01 06:00:00" "2013-03-01 07:00:00" "2013-03-01 08:00:00"
# [10] "2013-03-01 09:00:00"
但是当我尝试用新的数据格式替换现有数据时,我会收到警告并发出以下意外结果:
Data$time[1:10] <- strptime(Data$time[1:10], format="%l:%M %p")
# Warning message:
# In Data$time[1:10] <- strptime(Data$time[1:10], format = "%l:%M %p") :
# number of items to replace is not a multiple of replacement length
Data
# time
# 1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
# 2 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
# 3 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
# 4 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
# 5 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
# 6 113, 113, 113, 113, 113, 113, 113, 113, 113, 113
# 7 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
# 8 59, 59, 59, 59, 59, 59, 59, 59, 59, 59
# 9 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
# 10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
# 11 10:00 AM
# 12 11:00 AM
当我在上面的问题中运行代码Data$time[1:10] <- strptime(Data$time[1:10], format="%l:%M %p")
并且View(Data)
标准RGui中的结果数据看起来像预期的那样,但是当我在RStudio中View(Data)
时,上面的意外结果是显示。在RGui和RStudio中,函数class(Data$time)
返回[1] "POSIXlt" "POSIXt"
并按预期运行。这似乎是在RStudio中显示数据的问题。
答案 0 :(得分:1)
我不知道过去这有什么用,除非早期版本的R支持它...
strptime
返回一个POSIXlt
对象,该对象是包含多个组件的列表(有关元素的说明,请参阅?POSIXlt
)。出现问题是因为您尝试用POSIXlt
对象替换字符向量的一部分。这会将整个列转换为一个列表,其中前10个元素是POSIXlt
对象的组件,后两个元素是字符向量中的原始元素。
如果您使用strptime
的结果替换整个列,或者使用strptime
的结果创建一个新列,那么一切都会正常工作:
Data$time2 <- strptime(Data$time, format="%l:%M %p")
Data$time <- strptime(Data$time, format="%l:%M %p")