没有指定格式的日期转换

时间:2014-04-10 10:32:47

标签: r datetime date-conversion lubridate

我不明白" ymd"来自图书馆的功能" lubridate"在R中工作。我正在尝试构建一个功能,可以正确转换日期,而无需指定格式。我正在检查由于dmy(),mdy()和ymd()函数而发生的最小NA数。

所以ymd()有时会给NA,有时候不会给同一个Date值。 R中是否有其他功能或包,这将帮助我解决这个问题。

> data$DTTM[1:5]
[1] "4-Sep-06"  "27-Oct-06" "8-Jan-07"  "28-Jan-07" "5-Jan-07" 

> ymd(data$DTTM[1])
[1] NA
Warning message:
All formats failed to parse. No formats found. 
> ymd(data$DTTM[2])
[1] "2027-10-06 UTC"
> ymd(data$DTTM[3])
[1] NA
Warning message:
All formats failed to parse. No formats found. 
> ymd(data$DTTM[4])
[1] "2028-01-07 UTC"
> ymd(data$DTTM[5])
[1] NA
Warning message:
All formats failed to parse. No formats found. 
> 

> ymd(data$DTTM[1:5])
[1] "2004-09-06 UTC" "2027-10-06 UTC" "2008-01-07 UTC" "2028-01-07 UTC"
[5] "2005-01-07 UTC"

由于

3 个答案:

答案 0 :(得分:5)

@ user1317221_G已经指出您的日期是日 - 月 - 年格式,这表示您应该使用dmy而不是ymd。此外,由于您的月份为%b格式("当前区域设置中缩写的月份名称";请参阅?strptime),因此您的问题可能与您的{{1}有关}。您拥有的月份名称似乎是英语,这可能与您当前使用的语言环境中的拼写方式不同。

让我们看看当我在locale的日期dmy上尝试时会发生什么:

locale

&#34; 27-OCT-06&#34;无法解析。让我们检查一下date_english <- c("4-Sep-06", "27-Oct-06", "8-Jan-07", "28-Jan-07", "5-Jan-07") dmy(date_english) # [1] "2006-09-04 UTC" NA "2007-01-08 UTC" "2007-01-28 UTC" "2007-01-05 UTC" # Warning message: # 1 failed to parse.

locale

dmy不承认&#34; oct&#34;作为我所在地区的有效Sys.getlocale("LC_TIME") # [1] "Norwegian (Bokmål)_Norway.1252" 月。

处理这个问题的一种方法是改变&#34; oct&#34;相应的挪威语缩写,&#34; okt&#34;:

%b

另一种可能性是使用原始日期(即原始日期&#39;区域设置&#39;),并在date_nor <- c("4-Sep-06", "27-Okt-06", "8-Jan-07", "28-Jan-07", "5-Jan-07" ) dmy(date_nor) # [1] "2006-09-04 UTC" "2006-10-27 UTC" "2007-01-08 UTC" "2007-01-28 UTC" "2007-01-05 UTC" 中设置locale参数。究竟如何做到这一点取决于平台(参见dmy。以下是我将如何在Windows中执行此操作:

?locales

答案 1 :(得分:1)

使用lubridate包中的guess_formats函数将是您最接近的。

library(lubridate)
x <- c("4-Sep-06", "27-Oct-06","8-Jan-07" ,"28-Jan-07","5-Jan-2007")
format <- guess_formats(x, c("mdY", "BdY", "Bdy", "bdY", "bdy", "mdy", "dby"))
strptime(x, format)

HTH

答案 2 :(得分:0)

来自page 70

上的ymd上的文档
  

只要格式的顺序是   正确的是,即使输入向量包含不同的内容,这些函数也会正确解析日期   格式化日期

ymd()预计年 - 月 - 日,您有日 - 月 -

x <- c("2009-01-01", "2009-01-02", "2009-01-03")
ymd(x)

也许你需要像

这样的东西
y <- c("4-Sep-06",  "27-Oct-06", "8-Jan-07",  "28-Jan-07", "5-Jan-07" )
as.POSIXct(y, format = "%d-%b-%y")

PS我认为你得到NA s的原因是你只有一年的单个数字而ymd不知道该怎么做,但是当你有年份的两位数,例如"27-Oct-06" "28-Jan-07",但"5-Jan-07"

失败