在R中格式化日期到年月

时间:2018-05-14 20:04:25

标签: r shiny lubridate

我希望将当前日期列保留为年 - 月格式作为日期。它目前被转换为chr格式。我尝试了as_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 个答案:

答案 0 :(得分:1)

您可以使用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))

答案 1 :(得分:1)

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 :(得分:1)

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

这对按月对数据框中的所有其他变量进行分组(实际上是您要尝试执行的操作)很有用。但是cut将创建一个因子,但是可以将其转换回日期。因此,您仍然可以在数据框中使用日期类。

您只是无法摆脱某个日期中的某天(因为那不是一个日期...)。之后,您可以为轴或表创建一个不错的格式。例如:

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)