我不明白库"lubridate"中的"ymd"函数在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"
感谢
@user1317221_G已经指出您的日期是日-月-年格式,这建议您应该使用dmy
而不是ymd
。此外,由于您的月份是%b
格式("当前区域设置中的缩写月份名称";请参阅?strptime
),因此您的问题可能与locale
有关。您的月份名称似乎是英文的,这可能与您当前使用的区域设置中的拼写方式不同。
让我们看看当我在locale
:中的日期上尝试dmy
时会发生什么
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.
"2006年10月27日"解析失败。让我们检查一下我的时间locale
:
Sys.getlocale("LC_TIME")
# [1] "Norwegian (Bokmål)_Norway.1252"
dmy在我的区域设置中不将"oct"识别为有效的%b
月份。
处理这个问题的一种方法是将"oct"更改为相应的挪威缩写"okt":
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
中设置locale
参数。具体的操作方式取决于平台(请参阅?locales
。以下是我在Windows:中的操作方式
dmy(date_english, locale = "English")
[1] "2006-09-04 UTC" "2006-10-27 UTC" "2007-01-08 UTC" "2007-01-28 UTC" "2007-01-05 UTC"
在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
来自第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
的原因是,年份只有一个数字,而ymd
不知道该怎么办,但当年份有两个数字时,它会起作用,例如"27-Oct-06" "28-Jan-07"
,但对"5-Jan-07"
等失败。