首页 > 解决方案 > 如何使用 R 清理数据框中混乱的日期格式

问题描述

什么是清理具有多种日期格式的列并仅获取年份的快速方法?假设r有一个dataframe (df)如下所示的,其中有一Datecharacters具有不同的日期格式。

df <- data.frame(z= paste("Date",seq(1:10)), Date=c("2000-10-22", "9/21/2001", "2003", "2017/2018", "9/28/2010",
                       "9/27/2011","2019/2020", "2017-10/2018-12", "NA", "" ))
df:
     z            Date
1   Date 1      2000-10-22
2   Date 2       9/21/2001
3   Date 3            2003
4   Date 4       2017/2018
5   Date 5       9/28/2010
6   Date 6       9/27/2011
7   Date 7       2019/2020
8   Date 8 2017-10/2018-12
9   Date 9              NA
10 Date 10     

       

使用 r 命令从日期列中提取年份(例如 2003 年、2010 年)的快速方法是什么?连续两年的单元格将选择第一年。

这样预期的输出将如下所示:

     z            Date     year
1   Date 1      2000-10-22 2000
2   Date 2       9/21/2001 2001
3   Date 3            2003 2003
4   Date 4       2007/2018 2017
5   Date 5       9/28/2010 2010
6   Date 6       9/27/2011 2011
7   Date 7       2007/2018 2019
8   Date 8 2017-10/2018-12 2017
9   Date 9              NA   NA
10 Date 10                 

标签: rdate

解决方案


使用 tidyr 的提取物。如果有两年,它将使用第一个。

library(dplyr)
library(tidyr)

df %>% extract(Date, "Year", "(\\d{4})", remove = FALSE, convert = TRUE)

给予:

         z            Date Year
1   Date 1      2000-10-22 2000
2   Date 2       9/21/2001 2001
3   Date 3            2003 2003
4   Date 4       2017/2018 2017
5   Date 5       9/28/2010 2010
6   Date 6       9/27/2011 2011
7   Date 7       2019/2020 2019
8   Date 8 2017-10/2018-12 2017
9   Date 9              NA   NA
10 Date 10                   NA

如果还需要第二年,那么:

df %>% 
  extract(Date, "Year2", "\\d{4}.*(\\d{4})", remove = FALSE, convert = TRUE) %>%
  extract(Date, "Year", "(\\d{4})", remove = FALSE, convert = TRUE)

给予:

         z            Date Year Year2
1   Date 1      2000-10-22 2000    NA
2   Date 2       9/21/2001 2001    NA
3   Date 3            2003 2003    NA
4   Date 4       2017/2018 2017  2018
5   Date 5       9/28/2010 2010    NA
6   Date 6       9/27/2011 2011    NA
7   Date 7       2019/2020 2019  2020
8   Date 8 2017-10/2018-12 2017  2018
9   Date 9              NA   NA    NA
10 Date 10                   NA    NA

推荐阅读