2013-11-21 109 views
1

我收到警告,当我尝试读取vector a其中包含许多日期。Lubridate解析日期警告

这里的文本文件vector a我使用write(a,"a.txt")做。由于它非常大,我已将它附加到Google驱动器上供任何人下载。基本上,它包含2012-01-01至2012-12-31的日期,重复多次。

https://drive.google.com/file/d/0B12dCpdCVHeSZjA4YmVXNmV6VUU/edit?usp=sharing

我试图做到这一点,收到一条警告消息。

> head(ymd(a)) 
[1] "2012-01-01 UTC" "2012-01-01 UTC" "2012-01-01 UTC" "2012-01-01 UTC" "2012-01-01 UTC" 
[6] "2012-01-01 UTC" 
Warning message: 
7202 failed to parse. 

看看警告消息,很容易假设日期格式错误。但是,YYYY-MM-DD是由lubridate支持的格式。当我对矢量的一部分执行相同操作时,什么都不会发生。

> head(ymd(a[1:50000])) 
[1] "2012-01-01 UTC" "2012-01-01 UTC" "2012-01-01 UTC" "2012-01-01 UTC" "2012-01-01 UTC" 
[6] "2012-01-01 UTC" 

使用strptimeas.Date也不会产生任何错误

> head(strptime(a,format="%Y-%m-%d")) 
[1] "2012-01-01" "2012-01-01" "2012-01-01" "2012-01-01" "2012-01-01" "2012-01-01" 
> head(as.Date(a)) 
[1] "2012-01-01" "2012-01-01" "2012-01-01" "2012-01-01" "2012-01-01" "2012-01-01" 

我的问题是,我需要担心的警告信息或我可以放心地忽略它?

+2

我从行号122241开始得到类似“2012-03-01(1)”的值。我不知道可能是我错了,但因为这可能是你得到警告。 – PKumar

+0

啊,就是这样。谢谢! –

回答

2
> b <- which(is.na(ymd(as.character(a[[1]]), tz="UTC"))) 
Warning message: 
7202 failed to parse. 
> head(b) 
[1] 122241 122242 122243 122244 122245 122246 
> as.character(a[[1]])[head(b)] 
[1] "2012-03-01(1)" "2012-03-01(1)" "2012-03-01(1)" "2012-03-01(1)" "2012-03-01(1)" 
[6] "2012-03-01(1)" 

看起来存在由大间隙分开这些异常的日期的字符串:使用anydate包,它似乎工作

rle(diff(b)) 
Run Length Encoding 
    lengths: int [1:15] 1183 1 831 1 928 1 605 1 639 1 ... 
    values : int [1:15] 1 111657 1 29857 1 26065 1 25111 1 65729 ... 
+1

这是一个很好的答案,但如果我们可以直接访问导致警告的数据,它仍然会很好。 –

0

不同的解决方案。

library(anydate) 
text <- anydate(a[, 1]) 
sum(is.na(text)) 

# 0