【问题标题】:gsub in R to standardize mixed date format in data frame [duplicate]R中的gsub标准化数据框中的混合日期格式[重复]
【发布时间】:2020-08-20 04:04:31
【问题描述】:

我有一个包含不同格式日期的数据框。 想首先只在拥有它的年份删除19,然后使用as.POSIXlt 转换日期。 但是 gsub 没有启动

df.DOB <- c("12/11/99", "10/24/67", "8/18/13", "2/29/45", "2/28/63", "12/14/77",
            "07/25/1923", "01/07/1989", "09/02/1974")

gsub("\\/19.*", "", df.DOB)

# [1] "12/11/99" "10/24/67" "8/18/13"  "2/29/45"  "2/28/63"  "12/14/77" "07/25"  "01/07" "09/02" 

df.DOB.formatted <- as.POSIXlt(df.DOB, format = "%m/%d/%y")
df.DOB.formatted <- df.DOB.formatted - 100L
df.DOB.formatted

# [1] "1999-12-10 23:58:20 EST" "2067-10-23 23:58:20 EDT" "2013-08-17 23:58:20 EDT"
# [4] NA                        "2063-02-27 23:58:20 EST" "1977-12-13 23:58:20 EST"
# [7] "2019-07-24 23:58:20 EDT" "2019-01-06 23:58:20 EST" "2019-09-01 23:58:20 EDT"

非常感谢您的帮助

谢谢

【问题讨论】:

  • 我们怎么知道8/18/13 应该被解释为08/18/1913 而不是08/18/2013?您需要在此处澄清许多极端情况。
  • 您的最终预期输出是什么?也许这里有更好的方法,根本不涉及gsub 步骤。
  • 首先我期待 > gsub("\\/19.*","",df.DOB) [1] "12/11/99" "10/24/67" " 8/18/13" "2/29/45" "2/28/63" "12/14/77" "07/25/23" "01/07/89" [9] "09/02/74 "

标签: r regex dataframe date gsub


【解决方案1】:

我在 df.DOB 中添加了一个额外的条目以将 19 作为日期。

您可以使用sub 删除后跟两个字符的“19”。

df.DOB <- c("12/11/99","10/24/67","07/25/1923", "01/07/1989",
             "09/02/1974","01/19/1987")
sub('19(?=..$)', '', df.DOB, perl = TRUE)
#[1] "12/11/99" "10/24/67" "07/25/23" "01/07/89" "09/02/74" "01/19/87"

【讨论】:

  • 是的!看起来更健壮!能否请您解释一下19(?=..$) 部分?
  • ?= 是一个正则前瞻正则表达式,只有在 19 后面跟着两个位于字符串末尾的字符时才会删除它。
  • @sahuno 很高兴能帮上忙!请随意accept one of the answer,点击投票按钮旁边的复选标记最适合您:-) 每个帖子只能接受一个答案。
【解决方案2】:

另一个regex 模式:

df.DOB <- c("12/11/99", "10/24/67", "07/25/1923", "01/07/1989", "09/02/1974", "01/19/1987")

sub("19(..)$", "\\1", df.DOB)

# [1] "12/11/99" "10/24/67" "07/25/23" "01/07/89" "09/02/74" "01/19/87"

【讨论】:

    【解决方案3】:

    你可以使用 str_replace。

     library(stringr)
     df.DOB <- c("12/11/99","10/24/67","8/18/13","2/29/45","2/28/63","12/14/77", 
            "07/25/1923","01/07/1989","09/02/1974")
    
     str_replace(df.DOB, "19", "")
     # if you have 19 in other parts
     str_replace(df.DOB, "19(?=..$)", "") # From Ronak and Darren comments
    

    另一种解决方案是您可以将月份和年份分开并仅在年份应用替换(感谢所有对我的回答的 cmets):

    df.DOB <- c("12/19/1999","10/24/67","8/19/13","2/29/45","2/28/63","12/14/77", 
               "07/25/1923","01/07/1989","09/02/1974")
    
    df1 = str_split(df.DOB, "/", simplify = TRUE) 
    df1[,3] = str_replace(df1[,3], "19", "")
    apply(df1,1,function(d) paste(d,collapse = "/"))
    

    【讨论】:

    • 这也会从日期中删除“19”。
    • 我在第 19 天看到了并发症。例如 df.DOB
    • str_replace(string, pattern, "") 等价于str_remove(string, pattern)。也许后者更简洁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2014-10-13
    相关资源
    最近更新 更多