我不明白" 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"
由于
答案 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"
等