将字符月份名称转换为日期时间对象

时间:2016-09-29 06:04:36

标签: r date lubridate

我一定很遗憾。

我有一个不同日期格式的数据框架,而且我使用的是相应的 月份名称 以外的所有内容。我无法将月份名称转换为日期时间对象。

> head(dates)
    From         To
1       June     August
2    January   December
3 05/01/2013 10/30/2013
4       July   November
5 06/17/2013 10/14/2013
6 05/04/2013 11/23/2013

尝试将June更改为日期时间对象:

> as_date(dates[1,1])
Error in charToDate(x) : 
  character string is not in a standard unambiguous format

> as_date("June")
Error in charToDate(x) : 
  character string is not in a standard unambiguous format
  • 实际年份和日期无关紧要。我只需要一个月。 zx8754建议使用虚拟日期和年份。

3 个答案:

答案 0 :(得分:3)

使用自定义功能:

{{1}}

答案 1 :(得分:2)

以下是如何实现这一目标的粗略示例。

假设虚拟值很好:

match(dates[1, 1], month.abb)

鉴于我们在Dec中有dates[1. 1]

,上述内容会返回给您
12

要生成上面返回的值以及日期格式的虚拟数字,我试过:

tmp = paste(match(dates[1, 1], month.abb), "2013", sep="/")

给了我们:

12/2013

然后最后:

result = paste("01", tmp, sep="/")

返回:

01/12/2013

我相信有比这更灵活的方法;但这只是一个想法,我刚试过。

答案 2 :(得分:0)

lubridate可以处理将月份的名称或缩写转换为其数字,并将其与确定正确日期(即年和年)所需的其余信息配对的情况。例如:

lubridate::mdy("August/01/2013", "08/01/2013", "Aug/01/2013")
#> [1] "2013-08-01" "2013-08-01" "2013-08-01"

您可以利用该函数编写一个函数,在任何月份名称后附加“ / 01/2013”​​(为了安全起见,我也使用缩写形式)。然后将其应用于所有日期列(dplyr::mutate_all只是这样做的一种方法)。

name_to_date <- function(x) {
  lubridate::mdy(ifelse(x %in% c(month.name, month.abb), paste0(x, "/01/2013"), x))
}

dplyr::mutate_all(dates, name_to_date)
#>         From         To
#> 1 2013-06-01 2013-08-01
#> 2 2013-01-01 2013-12-01
#> 3 2013-05-01 2013-10-30
#> 4 2013-07-01 2013-11-01
#> 5 2013-06-17 2013-10-14
#> 6 2013-05-04 2013-11-23
相关问题