【问题标题】:Why cannot I transform the string "Feb 13 23:30:01 2014" to Date in R?为什么我不能将字符串“Feb 13 23:30:01 2014”转换为 R 中的日期?
【发布时间】:2015-08-11 05:58:26
【问题描述】:

我正在尝试将诸如“Feb 13 23:28:34 2014”之类的字符串转换为日期。但是“as.Date”函数只产生“NA”。我怎样才能正确地做到这一点?

head(time)
[1] "Feb 13 23:28:34 2014" "Feb 13 23:30:01 2014" "Feb 13 23:32:01 2014"
[4] "Feb 13 23:35:48 2014" "Feb 13 23:43:45 2014" "Feb 14 00:07:05 2014"
time <- as.Date(time, format = "%b %d %H:%M:%S %Y")
head(time)
[1] NA NA NA NA NA NA

【问题讨论】:

  • 我无法重现 NA。 str &lt;- "Feb 13 23:28:34 2014"; as.Date(str, format='%b %d %H:%M:%S %Y') #[1] "2014-02-13"
  • @akrun 我也是,示例效果很好,我不明白为什么 NA。
  • 您的语言环境是什么? “Feb”是您的语言中“February”的正确缩写吗?您可能需要更改为英语语言环境。
  • 您可以尝试输入date() 以查看您的语言环境使用的系统。
  • 在转换之前检查class(time)

标签: r string date static


【解决方案1】:

时间不是标准格式。这应该可以解决问题。这是丑陋的代码,我承认。

library(lubridate)
library(stringr)

time  <- c("Feb 13 23:28:34 2014","Feb 13 23:30:01 2014","Feb 13 23:32:01 2014","Feb 13 23:35:48 2014","Feb 13 23:43:45 2014","Feb 14 00:07:05 2014")
year <- substr(time,start = 17,stop = 20)
time <- gsub(pattern = substr(time,start = 16,stop = 20),replacement = "",x = time)
time <- paste(year,time,sep = " ")

time  <- ymd_hms(time)

time

[1] "2014-02-13 23:28:34 UTC" "2014-02-13 23:30:01 UTC"
[3] "2014-02-13 23:32:01 UTC" "2014-02-13 23:35:48 UTC"
[5] "2014-02-13 23:43:45 UTC" "2014-02-14 00:07:05 UTC"
 time <- as.Date(time, format = "%b %d %H:%M:%S %Y")
 time
[1] "2014-02-13" "2014-02-13" "2014-02-13" "2014-02-13" "2014-02-13"
[6] "2014-02-14"

如果您打算转换为时间格式,这就是诀窍。如果你想转换成其他时间格式,也可以。

【讨论】:

  • 没有必要做所有这些。如果他们的语言环境正确,他们的代码可以正常工作。
  • 他在转换时间时丢失了信息。 “2014-02-13”等,不是他要找的输出,他显然想转换成时间数据类型。我已经做到了。
  • 你怎么知道这不是他们想要的?他们说他们想要日期,他们得到了NA。用as.POSIXct 替换as.Date 调用会简单得多。
  • 你觉得上面的很简单?真的吗?无论如何,这是意见。
【解决方案2】:

正如 Roland 所建议的,这很可能是语言环境问题。试试?strptime示例部分中的内容。

R> lct <- Sys.getlocale("LC_TIME")  # store current time locale
R> Sys.setlocale("LC_TIME", "C")    # Use the "C" time locale
[1] "C"
R> x <- c("Feb 13 23:28:34 2014","Feb 13 23:30:01 2014","Feb 13 23:32:01 2014",
+        "Feb 13 23:35:48 2014","Feb 13 23:43:45 2014","Feb 14 00:07:05 2014")
R> # If you want a Date object (no time)
R> (d <- as.Date(x, format = "%b %d %H:%M:%S %Y"))
[1] "2014-02-13" "2014-02-13" "2014-02-13" "2014-02-13" "2014-02-13"
[6] "2014-02-14"
R> # If you want a POSIXt (date/time) object
R> (p <- as.POSIXct(x, format = "%b %d %H:%M:%S %Y"))
[1] "2014-02-13 23:28:34 CST" "2014-02-13 23:30:01 CST"
[3] "2014-02-13 23:32:01 CST" "2014-02-13 23:35:48 CST"
[5] "2014-02-13 23:43:45 CST" "2014-02-14 00:07:05 CST"
R> Sys.setlocale("LC_TIME", lct)  # restore original time locale
[1] "en_US.UTF-8"

【讨论】:

  • 谢谢。你是对的,我是一个中国的R精益者。这是一个语言环境问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多