【问题标题】:How to extract Month and Day from Date in R and convert it as a date type?如何从 R 中的日期中提取月份和日期并将其转换为日期类型?
【发布时间】:2018-03-26 10:33:51
【问题描述】:

我的R 会话是Rstudio,我有以下R 代码:

d1 <- read.csv("mydata.csv", stringsAsFactors = FALSE, header = TRUE)

d2 <- d1 %>% 
      mutate(PickUpDate = ymd(PickUpDate))

str(d2$PickUpDate)

上面最后一行代码的输出如下:

Date[1:14258], format: "2016-10-21" "2016-07-15" "2016-07-01" "2016-07-01" "2016-07-01" "2016-07-01" ...

我需要在dataframe d2 中添加一个列(我们称之为MthDD),这将是“PickUpDate”列的月份和日期。因此,MthDD 列的格式必须为mm-dd,但最重要的是,它仍应为date type

我怎样才能做到这一点?

更新: 我尝试了以下方法,但它将新列输出为字符类型。我需要该列是日期类型,以便我可以将其用作绘图的 x 轴组件。

d2$MthDD <- format(as.Date(d2$PickUpDate), "%m-%d")

【问题讨论】:

    标签: r date lubridate


    【解决方案1】:

    Date 对象不显示为 mm-dd。您可以使用该表示创建一个字符串,但它不再属于Date 类——它将属于character 类。

    如果您想要一个显示为 mm-dd 并且仍然像 Date 对象一样运行的对象,您可以做的是创建一个新的 Date 的 S3 子类,它以您想要的方式显示并使用它。在这里,我们创建了一个名为 mmddDate 的子类,其中包含一个 as.mmdd 泛型、一个 as.mmdd.Date 方法、一个 as.Date.mmdd 方法和一个 format.mmdd 方法。显示时将使用最后一个。 mmdd 将继承 Date 类的方法,但您可能仍需要定义其他方法,具体取决于您还想做什么——您可能需要进行一些试验。

    as.mmdd <- function(x, ...) UseMethod("as.mmdd")
    as.mmdd.Date <- function(x, ...) structure(x, class = c("mmdd", "Date"))
    
    as.Date.mmdd <- function(x, ...) structure(x, class = "Date")
    
    format.mmdd <- function(x, format = "%m-%d", ...) format(as.Date(x), format = format, ...)
    
    DF <- data.frame(x = as.Date("2018-03-26") + 0:2) # test data
    
    DF2 <- transform(DF, y = as.mmdd(x))
    

    给予:

    > DF2
               x     y
    1 2018-03-26 03-26
    2 2018-03-27 03-27
    3 2018-03-28 03-28
    
    > class(DF2$y)
    [1] "mmdd" "Date"
    
    > as.Date(DF2$y)
    [1] "2018-03-26" "2018-03-27" "2018-03-28"
    

    【讨论】:

      【解决方案2】:

      试试这个:

      PickUpDate2 <- format(PickUpDate,"%m-%d")
      PickUpDate2 <- as.Date(PickUpDate2, "%m-%d")
      

      这应该可以工作,之后您应该能够 bind_cols,或者按照您在提供的代码中提出的建议,立即将其添加到数据框中。所以代码应该替换为:

      d2$PickUpDate2 <- format(d2$PickUpDate,"%m-%d")
      d2$PickUpDate2 <- as.Date(d2$PickUpDate2, "%m-%d")
      

      【讨论】:

      • 你也可以看看这个帖子:stackoverflow.com/questions/22603847/…
      • 它将 PickUpDate 的所有“年份”部分替换为 2018 年。因此,像“2016-05-21”这样的日期变成“2018-05-21”
      猜你喜欢
      • 2019-03-20
      • 2022-01-24
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2017-10-28
      • 1970-01-01
      相关资源
      最近更新 更多