【问题标题】:error message: do not know how to convert 'dataFrame$col' to class “Date”错误消息:不知道如何将“dataFrame$col”转换为“日期”类
【发布时间】:2017-11-10 19:49:59
【问题描述】:

我有一个数据框,其中包含 2017 年 10 月的记录。第 6 列将日期作为字符向量。

这就是它的样子:

> october2017[1:6,1:6]
        V1        V2 V3  V4    V5        V6
1 89108060 IN0000005 P2 RK1 CA1-R 10/1/2017
2 10503818 IN0000014 P2 RK1  CA31 10/2/2017
3 89108152 765000054 P2 RK1  CA31 10/3/2017
4 89108152 765000197 P2 RK1  CA31 10/4/2017
5 89108206 200000162 P2 RK1  CA31 10/5/2017
6 89108206 100001098 P2 RK1  CA31 10/6/2017
> class(october2017$V6)
[1] "character"

实际的数据框比这个大很多。我想要做的是创建一个新列来表示与每个日期匹配的星期几并将其添加到数据框中。如果日期是“2017 年 10 月 1 日”,我希望表示星期几的新列在该行中显示“星期日”。

这就是我希望数据框的样子:

> october2017[1:6,1:7]
        V1        V2 V3  V4    V5        V6     V7
1 89108060 IN0000005 P2 RK1 CA1-R 10/1/2017 Sunday
2 10503818 IN0000014 P2 RK1  CA31 10/2/2017 Monday
3 89108152 765000054 P2 RK1  CA31 10/3/2017 Tuesday
4 89108152 765000197 P2 RK1  CA31 10/4/2017 Wednesday
5 89108206 200000162 P2 RK1  CA31 10/5/2017 Thursday
6 89108206 100001098 P2 RK1  CA31 10/6/2017 Friday

这是我尝试过的: newcol = weekdays(as.Date(october2017$v6, format="%m/%d/%Y")) october2017 = cbind(october2017,newcol, stringsAsFactors=FALSE)

这是我尝试运行此代码的第一行时收到的错误消息: as.Date.default(october2017$v6, format = "%m/%d/%Y") 中的错误: 不知道如何将“october2017$v6”转换为“日期”类

谁能帮我理解为什么会这样?

【问题讨论】:

  • 在您的问题中包含minimal reproducible example 会增加您获得答案的机会。
  • @Cedric,实际上这仍然适用于因素,尝试as.Date(factor("5/11/2017"), format='%m/%d/%Y'),所以它表明$v6 是别的东西。我支持 MWE 的投票。
  • @r2evans 感谢您的检查,我已经删除了关于因子类的评论。詹妮弗检查 r2evans 的答案。
  • @Cedric,我经常做同样的假设并跳到那个,我的习惯是很少使用因子(坦率地说,主要是ggplot faceting)。时不时地,当我不小心拥有它们并且事情仍然按设计工作时,我会感到惊讶。算了。
  • 是的,谢谢您的评论,stacomirtools::killfactor() 有点开玩笑,但解决了我的很多问题....

标签: r as.date


【解决方案1】:

as.Date 是一个使用 S3 方法调度的函数。也就是说,其实有几个功能:

methods("as.Date")
# [1] as.Date.character as.Date.date      as.Date.dates     as.Date.default  
# [5] as.Date.factor    as.Date.numeric   as.Date.POSIXct   as.Date.POSIXlt  
# see '?methods' for accessing help and source code

当您调用as.Date(x) 时,R 会查看第一个对象的类并使用适当的 S3 方法。如果没有找到并且存在.default 函数,那么它将被用作“最后的手段”。

如果您查看每个方法的源代码,您只会在as.Date.default 中找到字符串"do not know how to convert"

as.Date.default
# function (x, ...) 
# {
#     if (inherits(x, "Date")) 
#         return(x)
#     if (is.logical(x) && all(is.na(x))) 
#         return(structure(as.numeric(x), class = "Date"))
#     stop(gettextf("do not know how to convert '%s' to class %s", 
#         deparse(substitute(x)), dQuote("Date")), domain = NA)
# }

如果它是已知类之一(characterdatedatesfactornumericPOSIXctPOSIXlt,现在也不是 Date 或 @ 987654337@-NA),那么它将运行特定的函数(其中不包含该错误字符串)。这表明您的$v6 列是一个不同的类。没有 MWE,完全是猜测。

我建议你找到你的数据的实际类别

class(dataFrame$v6)

并弄清楚如何将其转换为已知版本之一。

编辑

此外,请注意 R 区分大小写。您的 MWE 使用小写的 v6,但您的列名是大写的。怎么样

october2017$V7 <- weekdays(as.Date(oct$V6, format="%m/%d/%Y"))

当你查看october2017$v6(小写)时,它返回NULL,这会触发as.Date.default方法。

【讨论】:

  • 詹妮弗,有什么想法或想法吗?
  • dataFrame$v6 是一个字符向量,由如下所示的字符串组成: "10/1/2017" "10/2/2017" "10/3/2017" "10/4/2017 " "10/5/2017" "10/6/2017" 等。我想做的是将它们从字符串更改为 R 将识别为日期的内容。我以为那是 as.Date 函数应该做的??!!!但是如果 as.Date 不起作用,那又会怎样呢?
  • 詹妮弗,我真的不知道没有看到更多。我不能只通过 StackOverflow 访问并查看您计算机上的数据,您需要编辑您的问题并给我一些可以使用的东西。 jsb 的建议链接是一个不错的链接,stackoverflow.com/help/mcve 也是如此。因此,请阅读其中一个或两个链接,然后编辑您的问题,添加一个展示您的困难的最小工作示例。
  • 我很抱歉没有包含 MWE。我现在到 Stack Overflow。我为你重写了这个问题。你能重现我的 MWE 吗?
  • 谢谢 r2evans。我将列的名称从 v6/V6 更改为 Delivery.Date,然后 october2017$V7
【解决方案2】:

这是事实发生几年后,但我想添加我用来解决此错误的替代方法。

首先,我将包含日期的字符向量提取到一个新向量中,然后将其转换为包含日期类向量的 1 列数据框。从那里我可以覆盖我日期中的原始列。

dates <- data$date.column
dates <- data.frame(as.Date(dates, format = "%Y-%m-%d"))
data$date.column <- dates

我不完全确定为什么有必要在中间步骤中将 as.Date() 调用包装在 data.frame() 中,但我发现没有它它会失败。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多