如何在R中从日期中提取月份和日期并将其转换为日期类型?

6

我用 Rstudio 进行 R 会话,并拥有以下 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类型。
如何实现呢?
更新: 我已经尝试了以下方法,但它将新列输出为字符型。我需要该列为日期类型,以便我可以将其用作绘图的x轴组件。
d2$MthDD <- format(as.Date(d2$PickUpDate), "%m-%d")
2个回答

4

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")

这应该可以工作,然后您应该能够在之后绑定列,或者直接将其添加到数据框中,就像您提供的代码中所建议的那样。因此,代码应替换为:

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

你也可以查看这个帖子:https://dev59.com/hWEh5IYBdhLWcg3wRRqh - Nordsted
1
它将PickUpDate中的所有“年”部分替换为2018年。 因此,像“2016-05-21”这样的日期变成了“2018-05-21”。 - user3115933

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接