【问题标题】:Why is R adding an extra row when converting characters to dates为什么R在将字符转换为日期时会添加额外的行
【发布时间】:2021-04-06 04:05:46
【问题描述】:

我正在使用 strptime 在 R 中将字符数据类型的向量转换为日期数据类型。

当我在转换后使用sapply 检查数据类型时,它给了我一个额外的行。

下面的小例子:

test_dates = c("2020-10-01","2019-08-09","2018-07-01")
sapply(test_dates,class)
2020-10-01  2019-08-09  2018-07-01 
"character" "character" "character" 

test_dates = strptime(test_dates, "%Y-%m-%d")
sapply(test_dates,class)
     [,1]      [,2]      [,3]     
[1,] "POSIXlt" "POSIXlt" "POSIXlt"
[2,] "POSIXt"  "POSIXt"  "POSIXt" 

最后的第二行是我不确定的部分。我不知道这是对sapply 的误解,还是与R 如何存储时间/日期有关。如下图,第二行数据什么都没有。

test_dates[1][1]
[1] "2020-10-01 BST"
test_dates[1][2]
[1] NA

提前感谢您的帮助。

【问题讨论】:

    标签: r date type-conversion posix


    【解决方案1】:

    我们也可以使用map

    library(purrr)
    map(test_dates, class)
    

    【讨论】:

      【解决方案2】:

      您可以使用 lubridate 包(ymd 函数)轻松将此向量转换为日期。类似的东西:

      test_dates <- c("2020-10-01","2019-08-09","2018-07-01")
      new_dates <- lubridate::ymd(test_dates)
      class(new_dates)
      

      希望对你有帮助:D

      【讨论】:

      • 感谢您的建议。使用它而不是 strptime 有优势吗?
      【解决方案3】:

      R 对象可以有多个类。您看到的第二行是因为strptime 返回具有两个类的对象,即POSIXltPOSIXt。当您使用 sapply 时,它会将数据简化为可能会造成混淆的矩阵。

      lapply 的输出可能不会那么混乱。

      lapply(test_dates, class)
      
      #[[1]]
      #[1] "POSIXlt" "POSIXt" 
      
      #[[2]]
      #[1] "POSIXlt" "POSIXt" 
      
      #[[3]]
      #[1] "POSIXlt" "POSIXt" 
      

      此外,向量只能有一个类,因此您可以检查整个向量的class 而不是每个单独的元素,因为它无论如何都会返回相同的值。

      class(test_dates)
      #[1] "POSIXlt" "POSIXt" 
      

      【讨论】:

      • 感谢@ronak-shah 的解释和额外的提示。你知道为什么日期有两个类吗?是不是因为一个是“纯”POSIX时间,保存在后台,另一个是显示给用户的版本,即当地时间?
      • 对不起,我不知道为什么日期时间变量有两个类。另外,我知道这不是您提出的问题,但如果您只有日期值,您可以使用 as.Date(test_dates) 将它们保留为唯一日期,这将为您提供“日期”类。
      猜你喜欢
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 2011-04-07
      • 2018-09-21
      相关资源
      最近更新 更多