0

去年,我使用下面的代码将字符串转换为日期时间并且它工作,但现在我在运行后得到了意想不到的结果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 中的结果数据时,它看起来与预期的一样,但是当我View(Data)在 RStudio 中时,会显示上面的意外结果。在 RGui 和 RStudio 中,函数class(Data$time)返回[1] "POSIXlt" "POSIXt"并按预期运行。这似乎是在 RStudio 中显示数据的问题。

4

1 回答 1

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")
于 2013-03-01T23:13:47.893 回答