使用多种格式将字符列转换为日期

时间:2018-04-30 15:45:45

标签: r dplyr tidyr lubridate stringr

这是我从excel开始的示例数据(下次,我将向我的客户介绍有关整洁的数据):

date_string  
3/13, 3/17, 3/20  
4/13  
5/12, 5/20  

我非常接近我想要的东西:

 library(tidyverse)  
 library(stringr)  
    data <- str_split_fixed(data$date_string, ",", 3)%>%  
    as_tibble() %>%  
    gather() %>%
    filter(value != "")  

然后我离开了这个:

key    value
v1    3/13  
v1    43203  
v1    5/12  
v2    3/17
v2    5/20
v3    3/20

这已经足够好了,我可以完成其余的格式化并安排在excel中,但我在R中做的越多越好,特别是当我下次更新时我必须再次这样做最终产品。我觉得有一个lubridate函数可以帮助我解决这个问题,但mdydate会一直回复错误。

我想要的值是上表,但是是m / d / y格式。

更新

根据以下答案,我添加了以下内容。这有效,但可能有一种更优雅的方式:

   data <- str_split_fixed(data$date_string, ",", 3)%>%  
    as_tibble() %>%  
    gather() %>%
    filter(value != "") %>%  
    mutate(value =  
     if_else(
      str_detect(value, "/") == T,
      paste0(value, "/2018"),
      as.character(as_date(as.numeric(value), origin = "1900-01-01")))) %>%        
    mutate(value =
     if_else(
      str_detect(value, "/") == T,
      mdy(value),
      ymd(value)))

我收到这些警告,但数据是我想要的:

1. In as_date(as.numeric(value), origin = "1900-01-01") :  
 NAs introduced by coercion
2. 1 failed to parse.
3. 5 failed to parse.

不确定它是如何解析&#34;当最后的&#34;值&#34; column作为日期变量返回。 。 。

2 个答案:

答案 0 :(得分:1)

以下是您可以做的事情:

首先,将年份添加到您的日期:

dates <- ("3/13", "4/17", "5/12", "3/17", "5/20", "3/20")
dates <- paste0(dates, "/18")

其次,转换它们指定格式(在你的情况下是m / d / y):

  as.Date(dates,  "%m/%d/%y")
  [1] "2018-03-13" "2018-04-17" "2018-05-12" "2018-03-17" "2018-05-20" "2018-03-20"

答案 1 :(得分:1)

这是一种略有不同的方法:

library(tidyverse)
library(stringr)
library(lubridate)

data <- c(
"3/13, 3/17, 3/20",
"4/13",
"5/12, 5/20")

df <- tibble(date_string = data) %>% 
  mutate(date_string = str_split(date_string, ", ")) %>% 
  unnest() %>% 
  mutate(date_string = ymd(str_c("2018-", date_string)))
df