【问题标题】:R - Help in Converting factor to date (%m/%d/%Y %H:%M)R - 帮助将因子转换为日期 (%m/%d/%Y %H:%M)
【发布时间】:2014-06-30 19:47:34
【问题描述】:

我正在将一个数据框导入 R,但 R 没有将带有日期的列识别为日期格式。

> mydata[1,1] [1] 1/1/2003 0:00 216332 Levels: 1/1/2003 0:00 1/1/2003 0:15 1/1/2003 0:30 ... 9/9/2007 9:55

我试过了:

> as.Date(mydata[1,1], format = "%m/%d/%Y %H:%M")
[1] "2003-01-01"

但后来我错过了时间。

如果我这样做了

> strptime(mydata[2,1], format = "%m/%d/%Y %H:%M")
[1] "2003-01-01 00:15:00 EST"

我得到了我需要的东西。但是,当我将此结果分配给我的变量时它不起作用

> mydata[,1] <- strptime(mydata[,1], format = "%m/%d/%Y %H:%M")
Warning message:
In `[<-.data.frame`(`*tmp*`, , 1, value = list(sec = c(0, 0, 0,  :
  provided 11 variables to replace 1 variables 

我的问题与Set time value into data frame cell的问题类似

虽然解释得很好,但在花了一些时间阅读和尝试之后,我无法自己弄清楚。

【问题讨论】:

  • 我可能会在这里错过一些东西,但为什么不选择as.POSIXctmydata[ , 1] &lt;- as.POSIXct(mydata[ , 1], format = "%m/%d/%Y %H:%M")
  • 它返回一条警告消息:Warning message: In [(*tmp*, iseq, value = 1191212100) : invalid factor level, NA generated。我可以按照 rrs 的建议使用 lubridate 包解决问题。不过感谢您的评论。
  • 那么您的数据中有一些特殊性未在您的示例中显示。这适用于一致格式的日期时间:mydata &lt;- data.frame(time = factor(c("1/14/2003 0:30", "9/19/2007 9:55"))); str(mydata); mydata[, 1] &lt;- as.POSIXct(mydata[,1], format = "%m/%d/%Y %H:%M"); str(mydata).

标签: r date dataframe type-conversion


【解决方案1】:

水平意味着你有一个因素。您需要使用 as.character() 转换为字符:

 dt <- as.POSIXct(as.character(mydata[ ,1]) format = "%m/%d/%Y %H:%M")

time = 0:00 的第一项不会显示打印的时间,但其他项会。发生错误是因为 POSIXlt 对象是 11 个项目列表的列表。一般来说,使用 as.POSIXct 比使用 strptime 更好,因为 strptime 返回一个 POSIXlt 对象,而且使用起来有点混乱。:

d <- factor("1/1/2003 0:01")
as.POSIXct( as.character(d), format = "%m/%d/%Y %H:%M")
[1] "2003-01-01 00:01:00 PST"

【讨论】:

  • 虽然我在看到您的帖子之前发现了 lubridate(它解决了问题),但我对其进行了测试并且措辞完美:&gt; mydata[,1] &lt;- as.POSIXct(as.character(mydata[ ,1]), format = "%m/%d/%Y %H:%M") &gt; mydata[1:10,1] [1] "2007-10-01 00:00:00 EDT" "2007-10-01 00:15:00 EDT" [3] "2007-10-01 00:30:00 EDT" "2007-10-01 00:45:00 EDT" [5] "2007-10-01 01:00:00 EDT" "2007-10-01 01:15:00 EDT" [7] "2007-10-01 01:30:00 EDT" "2007-10-01 01:45:00 EDT" [9] "2007-10-01 02:00:00 EDT" "2007-10-01 02:15:00 EDT"。谢谢!
【解决方案2】:

如果您使用read.tableread.csv 或类似函数来读入数据,那么您可以查看this solution 来指定哪些列将是日期并在读入时自动转换它们。这将在字符串上进行转换,而无需任何转换为​​因子(这可能是您的问题的一部分)。

【讨论】:

    【解决方案3】:

    在处理日期时,我发现lubridate 非常有帮助:

    library(lubridate)
    mydata[, 1] <- mdy_hm(mydata[, 1])
    

    【讨论】:

    • 这解决了我的问题。感谢您推荐该软件包,它确实避免了处理日期时的痛苦。
    【解决方案4】:

    如果你不想处理关卡,试试这个:

    首先将你的数据转换成字符:

    数据

    然后给出你需要的日期格式,例如:

    日期

    【讨论】:

    • 它仍然不起作用:&gt;data&lt;- as.character(mydata[2,1]) &gt;data [1] "10/1/2007 0:15" &gt; date&lt;- format(as.POSIXct(data, tz="EST"),"%Y-%m-%d %H:%M") &gt; date [1] "0010-01-20 00:00" rrs 建议的包 lubridate 运行良好。
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 2019-01-28
    • 2023-03-08
    • 2012-07-21
    • 2020-03-18
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多