Lubridate解析日期警告

时间:2013-11-21 04:31:15

标签: r lubridate

当我尝试阅读包含许多日期的vector a时,我收到了警告。

以下是我使用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 个答案:

答案 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)"

看起来这些异常日期的字符串被大间隙隔开:

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)

使用anydate包的不同解决方案,这似乎有效。

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

# 0