【问题标题】:How to get date in month-year format?如何以月年格式获取日期?
【发布时间】:2019-12-30 12:38:38
【问题描述】:

我从具有以下日期类型的某人那里获得了数据:

"Jan-20", "Feb-19", "May-18"

我想将它们转换成以下格式:

"01-20", "02-19", "05-18"

但每当我尝试将该列转换为 as.date 时,它都会返回 NA 值。

例如

df<- data.frame(MonthYear = c("Jan-20", "Feb-19", "May-18"))
df$MonthYear<-as.Date(df$MonthYear, format = "%b-%y")

输出:

MonthYear
1      <NA>
2      <NA>
3      <NA>

所以我使用了以下代码并添加了日期。但我不想要日期:

df<- data.frame(MonthYear = c("Jan-20", "Feb-19", "May-18"))
df$MonthYear<-paste(as.character(df$MonthYear))
df$MonthYear<-paste("01-",as.character(df$MonthYear))
df$MonthYear<-as.Date(df$MonthYear, format = "%d- %b-%y")

输出:

MonthYear
1 2020-01-01
2 2019-02-01
3 2018-05-01

但我需要的输出如下:

MonthYear
1 2020-01
2 2019-02
3 2018-05

【问题讨论】:

  • 如果你只是想将"Jan-20"转换成"01-20",也可以基于正则表达式进行替换,如:stringr::str_replace_all(c("Jan-20", "Feb-19", "May-18"), setNames(sprintf("%02d", 1:12), month.abb))

标签: r date datetime


【解决方案1】:

使用 zoo 包中的 as.yearmon()(和 magrittr 管道):

library(zoo)
library(magrittr)
as.yearmon(df$MonthYear, "%b-%y") %>%
 format(., "%Y-%m")


[1] "2020-01" "2019-02" "2018-05"

也可以不带'.'用作管道左侧的占位符。由于这些函数不是典型的 tidyverse 管道函数,因此将其保留。

as.yearmon(df$MonthYear, "%b-%y") %>%
 format("%Y-%m")

或者根本不使用管道,并使用嵌套函数(正如@Sotos 所指出的那样)。我发现它们更难阅读,而且通常都会加载 tidyverse(因此 %>% 管道)。

format(as.yearmon(df$MonthYear, "%b-%y"), "%Y-%m")

【讨论】:

  • 为什么要为管道加载一个额外的包?为什么不只是format(as.yearmon(...), '%Y-%m')
  • magrittr 管道确实不是必需的,你说得很好。我通常会加载 tidyverse,它显示了我对问题解决方案的看法。
  • 我认为这样更清楚,嵌套时很难解析信息,所以即使有额外的包,我认为这个解决方案也一样好,这是一个偏好问题,认知包的负载(您已经习惯了)或嵌套函数和使用非专业函数的认知负载。
  • format(., "%Y-%m") 中包含点是令人困惑的,因为它不是必需的,并且有处理点的特殊规则。
【解决方案2】:

您可以粘贴任意日期,转换为日期,然后使用format

format(as.Date(paste0("01-",df$MonthYear), "%d-%b-%y"), "%Y-%m")
#[1] "2020-01" "2019-02" "2018-05"

【讨论】:

    【解决方案3】:

    也许您可以尝试使用gsub() 仅保留年份和月份,即

    format(gsub("(.*)-\\d+","\\1",df$MonthYear),format = "%Y-%m")
    

    或者只是

    gsub("(.*)-\\d+","\\1",df$MonthYear)
    

    这样

    [1] "2020-01" "2019-02" "2018-05"
    

    数据

    df <- structure(list(MonthYear = structure(c(18262, 17928, 17652), class = "Date")), class = "data.frame", row.names = c(NA, 
    -3L))
    

    【讨论】:

      【解决方案4】:
      x <- c("Jan-20", "Feb-19", "May-18")
      for (i in seq_along(month.abb)) x <- sub(month.abb[i], sprintf("%02d", i), x) 
      # Can add fixed = TRUE for speed
      
      x
      # [1] "01-20" "02-19" "05-18"
      

      【讨论】:

      • 添加上下文以便我们从中学习,否则您最终将赢得 2019 年低质量帖子审查奖!这会让你的答案被删除。 (审查结束)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      相关资源
      最近更新 更多