use*_*217 1 datetime r date-conversion lubridate
我不明白来自库"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"
Run Code Online (Sandbox Code Playgroud)
谢谢
@ user1317221_G已经指出你的日期是日 - 月 - 年格式,这表明你应该使用dmy而不是ymd.此外,因为您的月份是%b格式("当前区域设置中的缩写月份名称";请参阅?strptime),您的问题可能与您的问题有关locale.您拥有的月份名称似乎是英语,这可能与您当前使用的语言环境中的拼写方式不同.
让我们看看当我dmy在我的日期中尝试时会发生什么locale:
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.
Run Code Online (Sandbox Code Playgroud)
"2006年10月27日"未能解析.我们来看看我的时间locale:
Sys.getlocale("LC_TIME")
# [1] "Norwegian (Bokmål)_Norway.1252"
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
另一种可能性是使用原始日期(即在其原始"语言环境"中),并设置locale参数dmy.具体如何做到这一点取决于平台(参见?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"
Run Code Online (Sandbox Code Playgroud)