【问题标题】:convert factor to date with empty cells使用空单元格将因子转换为日期
【发布时间】:2011-07-21 08:55:24
【问题描述】:

我有一个因子向量 x 看起来像这样:

""
"1992-02-13"
"2011-03-10"
""
"1998-11-30"

我可以将此向量转换为日期向量(使用as.Date())吗?

尝试显而易见的方法给了我:

> x <- as.Date(x)
Error in charToDate(x) :
character string is not in a standard unambiguous format

目前我这样解决这个问题:

> levels(x)[1] <- NA
> x <- as.Date(x)

但这看起来不太优雅......

提前谢谢你!

【问题讨论】:

    标签: r date


    【解决方案1】:

    您只需要告诉as.Date 在您的字符向量中期望什么格式:

    xd <- as.Date(x, format="%Y-%m-%d")
    xd
    [1] NA           "1992-02-13" "2011-03-10" NA           "1998-11-30"
    
    To illustrate that these are indeed dates:
    xd[3] - xd[2]
    Time difference of 6965 days
    

    PS。无论您的数据是字符向量还是因子,这种使用 as.Date 的转换都有效。

    【讨论】:

    • +1 用于间接注意到 as.Date() 转换为字符。
    【解决方案2】:

    当你用read.csv或其他方式拉取数据时,你可以设置

    read.csv(...,na.strings=c(""))
    

    避免不得不完全处理这个问题。

    【讨论】:

      【解决方案3】:

      我通常使用函数strptime 将因子转换为 POSIX* 类型类。第一个参数是您的向量,第二个参数是构造日期/时间的“模式”(% 符号 + 特定字母)。你基本上告诉 R,首先你有一年,然后你有 -,然后是一个月,依此类推。有关转换规范的完整列表,请参阅 ?strptime

      x <- factor(c("1992-02-13", "2011-03-10", "1998-11-30"))
      (x.date <- strptime(x, format = "%Y-%m-%d"))
       [1] "1992-02-13" "2011-03-10" "1998-11-30"
      class(x.date)
       [1] "POSIXlt" "POSIXt" 
      

      同样的原则也适用于as.Date。你告诉 R“把它变成一个日期/时间对象,这里是如何制作它的说明”。

      (as.Date(x, "%Y-%m-%d"))
       [1] "1992-02-13" "2011-03-10" "1998-11-30"
      

      【讨论】:

      • 这是一个危险的习惯,因为它可能会导致时区出现细微的错误。一般来说,最好避免对日期使用 POSIXt 类。
      • @G.格洛腾迪克,还有什么选择?
      • @RL,查看这篇文章的其他答案。他们不使用 POSIXt 类。
      • @G.格洛腾迪克,我没有意识到as.Date 产生了不同的类。我还没有真正使用过跨越多个时区的时间/日期,所以我没有特别注意这一点。谢谢你提出来。
      • @RL,请参阅 R News 4/1 帮助台文章。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多