【问题标题】:Unable to convert character / factor class into date无法将字符/因子类转换为日期
【发布时间】:2020-05-07 15:27:03
【问题描述】:

我知道这个问题被问了很多,但我只是因为我尝试了所有东西(包括我设法理解的类似问题的提示)才来找你。

我有一个相当大的 CSV 文件(> 16 000 行),其中有一个“日期”列,其中包含以下格式的日期“01/01/1999”。 但是,在加载文件时,该列不被识别为日期,而是作为带有 read.csv2 的因子,或带有 fread(data.table 包)的字符。我加载了 lubridate 库。 在这两种情况下,我都尝试使用我知道的所有方法(列 = 日期,数据 = 测试)将列转换为日期格式:

as.Date(test$Date, format = "%d/%m/%Y", tz = "")

或者

strptime(test$Date, format = "%d/%m/%y", tz = "")

或者

as_date(test$Date)

还有来自 lubridate 的函数 dmy,以及

as.POSIXct(test$Date, "%d/%m/%y", tz = "").

我还尝试更改格式:用 ymd 代替 dmy,用“-”代替“/”。 我什至尝试将字符类更改为数字(加载 fread 时),将因子类更改为数字(加载 read.csv2 时)。

尽管如此,列仍保留在其因子/字符类中。

有人知道我错过了什么吗?

【问题讨论】:

  • 你怎么知道它是“%d/%m/%Y”而不是“%m/%d/%Y”?
  • 只需使用dput 向我们展示您的数据摘录,我们知道您在说什么。请阅读:stackoverflow.com/questions/5963269/…
  • 只是出于好奇:您分配了结果,对吧? (<-) 你写“列在他们的因子/字符类中”而不是“这是我得到的错误”听起来有点可疑跨度>
  • akash87 : 是欧洲数据,天数在前,我犯了不显示数据的错误,所以你看不到。
  • 您不需要添加解释是什么解决了您的问题。接受答案就足够了。希望在社区中见到你。干杯。

标签: r date


【解决方案1】:

如果您使用的是 read.csv2,请尝试

read.csv2(..., stringsAsFactors=F)

然后继续 as.Date

【讨论】:

    【解决方案2】:

    只需使用 anytime 包中的 anydate() 函数即可:

    R> library(anytime)
    R> var <- as.factor(c("01/01/1999", "01/02/1999"))
    R> anydate(var)
    [1] "1999-01-01" "1999-01-02"
    R> 
    R> class(anydate(var))
    [1] "Date"
    R> 
    R> class(var)
    [1] "factor"
    R> 
    R> 
    

    它将读取大约任何输入时间,并将其转换不需要格式,只要所表示的内容有点标准(ie 我们不使用两位数的年份等)。

    (否则,您当然也可以使用基本 R 函数在首先通过 as.character() 将因子转换回字符。但是 anytime() 和 anydate() 这样做,等等,也适合你。)

    【讨论】:

    • 不客气。现在,这在 StackOverflow 上的工作方式是,您还可以“投票”我的答案(通过单击向上三角形)和“接受”我的答案(通过单击刻度线 - 只有您作为提问者看到那)。这是一个奖励好问题和好答案的好系统。通过接受,您还可以获得一些业力点。 (作为非常新的用户,您可能还无法投票。一旦您与网站进行了更多互动,就会出现这种情况。)
    • 你好,我想我首先确定了为什么会出现问题,这也造成了“anydate”函数的另一个问题:我的数据是欧洲日期格式(%d/% m/%Y),但是 anydate 将其识别为美国日期格式,将一个月 12 日之后的所有天返回为 NA,因为它将它们读取为月份。有没有办法解决这个问题?我尝试手动更改 .CSV 文件中的格式(通过更改单元格格式),但是 anydate 只给出“NA”。非常感谢您的宝贵时间
    • 我也担心这个,是的,你可以。简而言之,在欧洲和美国之间,d.m 和 m/d 格式会导致混淆。所以我们启发式地猜测“地理首选”的连字符和斜线。但是您可以在搜索列表的开头覆盖格式和您自己的格式——请参阅help(addFormats) 了解详细信息,addFormats("%d/%m/%Y") 应该可以满足您的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2016-01-10
    相关资源
    最近更新 更多