首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lubridate mdy函数

Lubridate mdy函数
EN

Stack Overflow用户
提问于 2016-06-10 05:02:46
回答 1查看 4.9K关注 0票数 2

我正在尝试转换以下内容,但其中一个日期1不成功。"4/2/10“变成了"0010-04-02”。

有没有办法纠正这个问题?

谢谢,Vivek

代码语言:javascript
复制
data <- data.frame(initialDiagnose = c("4/2/10","14.01.2009", "9/22/2005", 
        "4/21/2010", "28.01.2010", "09.01.2009", "3/28/2005", 
        "04.01.2005", "04.01.2005", "Created on 9/17/2010", "03 01 2010"))

mdy <- mdy(data$initialDiagnose) 
dmy <- dmy(data$initialDiagnose) 
mdy[is.na(mdy)] <- dmy[is.na(mdy)] # some dates are ambiguous, here we give 
data$initialDiagnose <- mdy        # mdy precedence over dmy
data

   initialDiagnose
1       0010-04-02
2       2009-01-14
3       2005-09-22
4       2010-04-21
5       2010-01-28
6       2009-09-01
7       2005-03-28
8       2005-04-01
9       2005-04-01
10      2010-09-17
11      2010-03-01
EN

回答 1

Stack Overflow用户

发布于 2016-06-10 05:27:02

我认为这是因为mdy()函数更喜欢使用%Y (实际年份)来匹配年份,而不是%y (两位数的年份缩写,默认为19XX或20XX)。

不过,还是有一个变通办法的。我查看了lubridate::parse_date_time (?parse_date_time)的帮助文件,在帮助文件的底部,有一个添加参数的示例,该参数优先于今年的%y格式,而不是%Y格式。帮助文件中的相关代码:

代码语言:javascript
复制
## ** how to use `select_formats` argument **
## By default %Y has precedence:
parse_date_time(c("27-09-13", "27-09-2013"), "dmy")
## [1] "13-09-27 UTC"   "2013-09-27 UTC"

## to give priority to %y format, define your own select_format function:

my_select <-   function(trained){
   n_fmts <- nchar(gsub("[^%]", "", names(trained))) + grepl("%y", names(trained))*1.5
   names(trained[ which.max(n_fmts) ])
}

parse_date_time(c("27-09-13", "27-09-2013"), "dmy", select_formats = my_select)
## '[1] "2013-09-27 UTC" "2013-09-27 UTC"

因此,对于您的示例,您可以调整此代码,并将mdy <- mdy(data$initialDiagnose)行替换为:

代码语言:javascript
复制
# Define a select function that prefers %y over %Y. This is copied 
# directly from the help files
my_select <-   function(trained){
  n_fmts <- nchar(gsub("[^%]", "", names(trained))) + grepl("%y", names(trained))*1.5
  names(trained[ which.max(n_fmts) ])
}

# Parse as mdy dates
mdy <- parse_date_time(data$initialDiagnose, "mdy", select_formats = my_select)
# [1] "2010-04-02 UTC" NA               "2005-09-22 UTC" "2010-04-21 UTC" NA              
# [6] "2009-09-01 UTC" "2005-03-28 UTC" "2005-04-01 UTC" "2005-04-01 UTC" "2010-09-17 UTC"
#[11] "2010-03-01 UTC"

然后运行你问题中的其余代码行,它给出了这个数据框作为结果:

代码语言:javascript
复制
   initialDiagnose
1       2010-04-02
2       2009-01-14
3       2005-09-22
4       2010-04-21
5       2010-01-28
6       2009-09-01
7       2005-03-28
8       2005-04-01
9       2005-04-01
10      2010-09-17
11      2010-03-01
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37736131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档