如何从R中的日期中提取月份和日期并将其转换为日期类型?
How to extract Month and Day from Date in R and convert it as a date type?
我 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 type
.
我怎样才能做到这一点?
更新:
我尝试了以下但它将新列输出为字符类型。我需要该列为日期类型,以便我可以将其用作绘图的 x-axis 组件。
d2$MthDD <- format(as.Date(d2$PickUpDate), "%m-%d")
试试这个:
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")
Date
对象不显示为 mm-dd。您可以使用该表示创建一个字符串,但它将不再是 Date
class -- 它将是 character
class.
如果您想要一个显示为 mm-dd 并且仍然像 Date
对象一样工作的对象,您可以做的是创建一个 Date
的新 S3 subclass以您想要的方式显示并使用它。在这里,我们创建了一个名为 mmdd
的 Date
的子 class,其中包含一个 as.mmdd
泛型、一个 as.mmdd.Date
方法、一个 as.Date.mmdd
方法和一个 format.mmdd
方法。最后一个将在显示时使用。 mmdd
将从 Date
class 继承方法,但您可能仍需要定义其他方法,具体取决于您还想做什么——您可能需要进行一些试验。
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"
我 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 type
.
我怎样才能做到这一点?
更新: 我尝试了以下但它将新列输出为字符类型。我需要该列为日期类型,以便我可以将其用作绘图的 x-axis 组件。
d2$MthDD <- format(as.Date(d2$PickUpDate), "%m-%d")
试试这个:
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")
Date
对象不显示为 mm-dd。您可以使用该表示创建一个字符串,但它将不再是 Date
class -- 它将是 character
class.
如果您想要一个显示为 mm-dd 并且仍然像 Date
对象一样工作的对象,您可以做的是创建一个 Date
的新 S3 subclass以您想要的方式显示并使用它。在这里,我们创建了一个名为 mmdd
的 Date
的子 class,其中包含一个 as.mmdd
泛型、一个 as.mmdd.Date
方法、一个 as.Date.mmdd
方法和一个 format.mmdd
方法。最后一个将在显示时使用。 mmdd
将从 Date
class 继承方法,但您可能仍需要定义其他方法,具体取决于您还想做什么——您可能需要进行一些试验。
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"