代码之家  ›  专栏  ›  技术社区  ›  AM_123

在R中设置日期到年月的格式

  •  13
  • AM_123  · 技术社区  · 6 年前

    我想以年-月格式保留当前日期列作为日期。它当前转换为chr格式。我尝试了as\u datetime,但它强制所有值为NA。 我想要的格式是:“2017-01”

    library(lubridate)
    df<- data.frame(Date=c("2017-01-01","2017-01-02","2017-01-03","2017-01-04",
                           "2018-01-01","2018-01-02","2018-02-01","2018-03-02"),
                N=c(24,10,13,12,10,10,33,45))
    df$Date <- as_datetime(df$Date)
    df$Date <- ymd(df$Date)
    df$Date <- strftime(df$Date,format="%Y-%m")
    

    提前谢谢!

    3 回复  |  直到 5 年前
        1
  •  12
  •   Mikael Poul Johannesson    6 年前

    lubridate 只处理日期,日期有天。然而,正如alistaire所提到的,你可以每月根据你想要的工作来确定他们:

    library(tidyverse)
    
    df_month <-
      df %>%
      mutate(Date = floor_date(as_date(Date), "month"))
    

    例如,如果您想按月份进行聚合,只需 group_by() summarize()

    df_month %>%
      group_by(Date) %>%
      summarize(N = sum(N)) %>%
      ungroup()
    
    #> # A tibble: 4 x 2
    #>  Date           N
    #>  <date>     <dbl>
    #>1 2017-01-01    59
    #>2 2018-01-01    20
    #>3 2018-02-01    33
    #>4 2018-03-01    45
    
        2
  •  6
  •   Wlademir Ribeiro Prates    6 年前

    您可以使用zoo::as解决此问题。yearmon()函数。遵循解决方案:

    library(tidyquant)
    library(magrittr) 
    library(dplyr)
    
    df <- data.frame(Date=c("2017-01-01","2017-01-02","2017-01-03","2017-01-04",
                      "2018-01-01","2018-01-02","2018-02-01","2018-03-02"),
               N=c(24,10,13,12,10,10,33,45))
    df %<>% mutate(Date = zoo::as.yearmon(Date))
    
        3
  •  2
  •   David Martinez C.    5 年前

    你可以用 cut 功能和用途 breaks="month" 将日期中的所有日期转换为每月的第一天。因此,同一个月内的任何日期都将在新创建的列中具有相同的日期。

    这对于按月对数据帧中的所有其他变量进行分组(基本上是您正在尝试的操作)非常有用。然而 将创建一个系数,但可以将其转换回日期。因此,您仍然可以在数据框中使用date类。

    你就是无法摆脱约会中的那一天(因为那时,不是约会…)。之后,您可以为轴或表创建一个好的格式。例如:

    true_date <-
      as.POSIXlt(
        c(
          "2017-01-01",
          "2017-01-02",
          "2017-01-03",
          "2017-01-04",
          "2018-01-01",
          "2018-01-02",
          "2018-02-01",
          "2018-03-02"
        ),
        format = "%F"
      )
    
    df <-
      data.frame(
        Date = cut(true_date, breaks = "month"),
        N = c(24, 10, 13, 12, 10, 10, 33, 45)
      )
    
    ## here df$Date is a 'factor'. You could use substr to create a formated column
    df$formated_date <- substr(df$Date, start = 1, stop = 7)
    
    ## and you can convert back to date class. format = "%F", is ISO 8601 standard date format
    
    df$true_date <- strptime(x = as.character(df$Date), format = "%F")
    
    str(df)