【问题标题】:Getting mysterious NA's when trying to parse date尝试解析日期时得到神秘的 NA
【发布时间】:2014-06-24 14:30:31
【问题描述】:

我没有在 R 中使用日期的经验。我已阅读所有文档,但我仍然无法弄清楚为什么会出现此错误。我正在尝试使用某种指定的格式获取字符串向量并将其转换为日期向量。我已经尝试过使用 for 循环和单独转换每个日期,或者使用像 sapply 这样的向量函数,但都没有工作。下面是使用 for 循环的代码:

dates = rawData[,ind] # get vector of date strings
print("single date example")
print(as.Date(dates[1]))
dDates = rep(1,length(dates)) # initialize vector of dates
class(dDates)="Date"
for (i in 1:length(dates)){
    dDates[i]=as.Date(dates[i])
}
print(dDates[1:10])

编辑:关于“日期”变量的信息

[1] "dates"
V16          V17          V18          V19          V36               
[1,] "2014-01-16" "2014-01-30" "2014-01-16" "2014-01-17" "1999-03-16 12:00"
[2,] "2014-01-04" "2014-01-18" "2014-01-04" "2014-01-08" "1998-09-04 12:00"
[3,] "2014-03-05" "2014-03-19" "2014-03-05" "2014-03-07" "1996-09-30 05:00"
[4,] "2014-01-21" "2014-02-04" "2014-01-22" "2014-01-24" "1995-08-21 12:00"
[5,] "2014-01-07" "2014-01-21" "2014-01-07" "2014-01-09" "1994-04-07 12:00"
[1] "class(dates)"
[1] "matrix"
[1] "class(dates[1,1])"
[1] "character"
[1] "dim(dates)"
[1] 56557     8

我得到的结果如下:

[1] "single date example"
[1] "2014-01-16"
Error in charToDate(x) : 
 character string is not in a standard unambiguous format

所以基本上,当我尝试将日期字符串的符号元素解析为日期时,它工作正常。但是当我尝试在循环中解析日期时,它会中断。怎么会这样?

我使用循环而不是 sapply 的原因是因为它返回了一个更奇怪的结果。当我尝试运行时:

dDates = sapply(dDates, function(x) as.Date(x, format = "%Y-%m-%d"))

我得到以下输出:

2014-01-16 2014-01-04 2014-03-05 2014-01-21 2014-01-07 2014-01-02 2014-01-08 
    NA         NA         NA         NA         NA         NA         NA 
2014-02-22 2014-01-09 2014-02-22 
    NA         NA         NA 

这很奇怪。如您所见,由于我的格式正确,它能够解析出日期。但由于某种原因,它也给出了 NA 的时间值(或者至少这是我认为 NA 的意思)。也许发生这种情况是因为我的一些日期字符串有时间,而另一些则没有。但问题是我把时间排除在格式之外,因为我不在乎时间。

有谁知道为什么会发生这种情况或如何解决?我在网上找不到任何可以轻松“设置”日期对象的时间值的地方——我似乎无法摆脱那个 NA。不知何故,即使是 for 循环也不起作用!要么是,输出很奇怪,即使我的格式正确,我也没有得到预期的结果。非常令人沮丧的是,像解析日期向量这样简单的事情比在 matlab 或 java 中要困难得多。

有什么帮助吗?

编辑:当我简单地尝试时

dDates = as.Date(dates,format="%m/%d/%Y")

我得到了输出

"dDates[1:10]"
[1] NA NA NA NA NA NA NA NA NA NA

仍然是那些神秘的 NA。我也遇到了错误

Error in as.Date.default(value) : 
do not know how to convert 'value' to class “Date”

【问题讨论】:

  • 请使用dput 提供dates 来制作reproducible
  • 你甚至不需要sapply ...
  • 您的数据可能是一个因素,而不是字符向量。
  • 所以试试as.Date(as.character(ddate), format="%Y-%m-%d")
  • 感谢您的所有 cmets。我已经编辑了问题以显示“日期”的值和类结构,而 dDates 是在上面的代码中定义的。

标签: r date


【解决方案1】:

使用您的数据子集,

v <- c("2014-01-16", "2014-01-30", "2014-01-16", "2014-01-17", "1999-03-16 12:00")

这些语句是等效的,因为您的格式是默认格式:

as.Date(v)
[1] "2014-01-16" "2014-01-30" "2014-01-16" "2014-01-17" "1999-03-16"
as.Date(v, format = "%Y-%m-%d")
[1] "2014-01-16" "2014-01-30" "2014-01-16" "2014-01-17" "1999-03-16"

如果您想格式化日期输出,请使用format

format(as.Date(v), format = "%m/%d/%Y")
[1] "01/16/2014" "01/30/2014" "01/16/2014" "01/17/2014" "03/16/1999"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 2017-11-12
    • 2020-01-05
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2016-03-11
    • 2021-10-14
    相关资源
    最近更新 更多