【问题标题】:I want to combine two variables into one with a date format我想用日期格式将两个变量合二为一
【发布时间】:2019-06-18 16:47:28
【问题描述】:

我有一个数据集,其中包含表示月份的字符列 (MONTH) 和表示年份的数字列 (YEAR)。为了将其用作面板数据,我需要将这些 YEARMONTH 合并为具有日期格式的变量。

我尝试将变量MONTH 更改为数字格式,然后将MONTHYEAR 列合并。 R 不会将其识别为日期变量。

目前看起来是这样的:

  STATE          MONTH     YEAR     VALUE
California        JAN      2018      800
California        FEB      2018      780
California        MAR      2018      600
    ...           ...       ...      ...
Minesota          JAN      2018      800
Minesota          FEB      2018      780
Minesota          MAR      2018      600
    ...           ...       ...      ...

我想要这样:

  STATE          TIME        VALUE
California     01-2018        800
California     02-2018        780
California     03-2018        600
    ...           ...         ...
Minesota       01-2018        800
Minesota       02-2018        780
Minesota       03-2018        600
    ...           ...         ...

【问题讨论】:

  • 日期需要日、月和年。因此,您可以将每个月的第一天添加为日期格式之前的任意一天,或者使用 zoo::as.yearmon 转换为“年月”对象。第一种方法见@tim-biegeleisen 的回答。

标签: r date datetime time


【解决方案1】:

在基础 R 中,您可以执行以下操作:

transform(df,TIME = paste(sprintf('%02d',match(MONTH,toupper(month.abb))),YEAR,sep = '-'))[c(1,5,4)]
       STATE    TIME VALUE
1 California 01-2018   800
2 California 02-2018   780
3 California 03-2018   600
4        ...  NA-...   ...
5   Minesota 01-2018   800
6   Minesota 02-2018   780
7   Minesota 03-2018   600

【讨论】:

    【解决方案2】:

    我建议通过真正的 R 日期处理此问题,使用 as.Date 生成 R 日期,然后使用 format 呈现您想要的字符串输出。像这样的:

    df$TIME <- format(as.Date(paste0(df$MONTH, df$YEAR, "01"), format="%b%Y%d"), "%m-%Y")
    

    我随意将第一个分配给您数据集中的每个日期,但这并不重要,因为对format 的调用仅包括月份和年份。

    【讨论】:

      【解决方案3】:

      将 Tim 的回复与易于使用的日期包 lubridate 相结合,我们得到:

      # This can handle months of JAN, FEB, ETC. Or it can handle months of 01,02,etc.
      df$TIME <- lubridate::ymd(paste0(df$YEAR,df$MONTH,"01")) 
      
      # or if you need it in MM-YYYY format:
      df$TIME <- format(lubridate::ymd(paste0(df$YEAR,df$MONTH,"01")), "%m-%Y")
      

      【讨论】:

        【解决方案4】:

        您可以简化以下内容,但这样更容易了解发生了什么:

        library(lubridate)
        library(tidyverse)
        
        df2 <- df %>% 
          mutate(TIME = parse_date_time(paste0(MONTH, YEAR), orders = "%b%Y"),
                 TIME = as.character(substr(TIME, 6, 7)),
                 TIME = paste0(TIME, "-", YEAR))
        

        这是使用 lubridate - 在 R IMO 中解析日期的最简单方法,dplyr 来自 tidyversesubstr 来自基础 R。

        如果您想保留日期列,则只需通过管道输入另一个 mutate 并将新列命名为不同的名称。

        【讨论】:

          【解决方案5】:

          如果您希望使用完整的 Tidyverse 解决方案,请考虑 tidyrlubridateparse_date_time 的组合:

          library(tidyverse)
          df <- tibble::tribble(
            ~STATE,      ~MONTH,      ~YEAR,   ~VALUE,
          "California",     "JAN",      2018,      800,
          "California",     "FEB",      2018,      780,
          "California",     "MAR",      2018,      600,
          "Minesota",       "JAN",      2018,      800,
          "Minesota",       "FEB",      2018,      780,
          "Minesota",       "MAR",      2018,      600)
          
          df %>%
             tidyr::unite(TIME, c(MONTH, YEAR), sep = "-") %>%
             dplyr::mutate(TIME = lubridate::parse_date_time(TIME, "my"))
          #> # A tibble: 6 x 3
          #>   STATE      TIME                VALUE
          #>   <chr>      <dttm>              <dbl>
          #> 1 California 2018-01-01 00:00:00   800
          #> 2 California 2018-02-01 00:00:00   780
          #> 3 California 2018-03-01 00:00:00   600
          #> 4 Minesota   2018-01-01 00:00:00   800
          #> 5 Minesota   2018-02-01 00:00:00   780
          #> 6 Minesota   2018-03-01 00:00:00   600
          

          还可以查看以下相关问题:Converting year and month ("yyyy-mm" format) to a date?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-23
            • 1970-01-01
            • 1970-01-01
            • 2021-06-25
            • 1970-01-01
            • 2014-05-30
            相关资源
            最近更新 更多