r-不指定格式的日期转换



我不明白库"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"等失败。

相关内容

  • 没有找到相关文章