【问题标题】:How do I create a column which takes a date from another column in R?如何创建一个从 R 中的另一列获取日期的列?
【发布时间】:2025-11-27 00:05:02
【问题描述】:

我有一个包含几列的数据框,最后一列称为Filename。这就是它的样子。

    Product Company Filename
       …        …       mg-tvd_bmmh_20170930.csv
       …        …       mg-tvd_bmmh_2016_06_13.csv
       …        …       …

我正在尝试在 R 中编写一个简短的脚本,该脚本从文件名中获取日期并将其转换为我称之为 Date 的新列。所以一个新的数据框应该是这样的:

     Product    Company   Date          Filename
       …          …       09/30/2017    mg-tvd_bmmh_20170930.csv
       …          …       16/13/2017    mg-tvd_bmmh_2016_06_13.csv
       …          …        …                …   

这是我脚本的相关部分。

   df <- mutate(df, Date <- grep(pattern = "(\d{4})_?(\d{2})_?
   (\d{1,2})", df$Filename, value = TRUE))
   ddf$Date <- as.Date(Date,format = "%m/%d/%y")

任何建议为什么我不能让它工作?

我收到以下错误:

 Error: '\d' is an unrecognized escape in character string starting ""(\d"
 Error in as.Date(Date, format = "%m/%d/%y") :
   object 'Date' not found

【问题讨论】:

  • 哪里出错了?看起来您的日期格式行应该是 ddf$Date
  • > 错误:'\d' 是从 ""(\d" 开始的字符串中无法识别的转义 > as.Date(Date, format = "%m/%d/%y" 中的错误) : 找不到对象“日期”

标签: r regex date dplyr


【解决方案1】:

你可以使用这个命令:

transform(df, Date = as.Date(sub(".*\\D(\\d{4})_?(\\d{2})_?(\\d{1,2}).*",
                                 "\\1\\2\\3", Filename), "%Y%m%d"))

【讨论】:

    【解决方案2】:

    您收到错误是因为:

    ddf$Date <- as.Date(Date,format = "%m/%d/%y")
    

    你应该有:

    df$Date <- as.Date(df$Date,format = "%Y/%m/%d")
    

    或:

    df %>%
      mutate(Date = as.Date(df$Date,format = "%Y/%m/%d"))
    

    format = "%m/%d/%y" 的不正确规范会给你Date 中的 NA 值,而as.Date(Date, ... 的不正确引用会给你带来错误。

    您还可以使用stringr 中的str_extract 提取日期,并使用lubridate 中的ymd 将其解析为日期对象:

    library(dplyr)
    library(stringr)
    library(lubridate)
    
    df %>%
      mutate(Date = ymd(str_extract(Filename, "\\d{4}_?\\d{2}_?\\d{2}(?=\\.csv)")))
    

    数据:

      Product Company                   Filename       Date
    1       1       3   mg-tvd_bmmh_20170930.csv 2017-09-30
    2       2       4 mg-tvd_bmmh_2016_06_13.csv 2016-06-13
    

    ymd 的优势在于它“......识别任意非数字分隔符以及没有分隔符......” 所以不需要标准化 Date 字符解析前的向量。例如,

    > df$Filename %>% str_extract("\\d{4}_?\\d{2}_?\\d{2}(?=\\.csv)")
    [1] "20170930"   "2016_06_13"
    

    【讨论】:

      【解决方案3】:

      您显示的错误源于正则表达式中的特殊字符需要在 R 中进行双重转义(例如,\d 应该是 \\d)。我建议在正则表达式部分使用sub,以便您可以控制输出,并在下划线后添加通配符(*)以获取匹配项(如果有或没有下划线(如您的示例所示)。

      as.Date 格式需要大写 Y (%Y) 表示年份。

      更新后的代码是:

      df <- mutate(df, Date = sub(pattern = ".*_(\\d{4})_*(\\d{2})_*(\\d{1,2}).*", "\\2/\\3/\\1", df$Filename))  
      df$Date <- as.Date(df$Date,format = "%m/%d/%Y")
      

      【讨论】:

        最近更新 更多