用R中的lubridate仅提取日期和月份,并保留日期格式

4
我希望能在不改变日期格式的情况下实现这一目标。
ID    Date         DayMonth
1     2004-02-06   06-02
2     2006-03-14   14-03
3     2007-07-16   16-07
...   ...          ...

谢谢

这是一种方法,但是否有更快的方法并保留日期格式(as.date)

date = df %>% mutate(DayDate=day(Date)) %>% mutate(MonthDate=month(Date)) %>%
  unite(DayMonth, c("DayDate", "MonthDate"), sep = "-")
2个回答

3

在创建两列之后,我们可以直接使用 format 代替 unite 步骤。

library(dplyr)
df %>%
    mutate(DayMonth = format(as.Date(Date), "%d-%m"))
#  ID       Date DayMonth
#1  1 2004-02-06    06-02
#2  2 2006-03-14    14-03
#3  3 2007-07-16    16-07

或者使用基础的 R 语言。
df$DayMonth <- format(as.Date(df$Date), "%d-%m")

基准测试

在稍微大一点的数据集上进行测试

library(tidyr)
library(lubridate)
df1 <- df %>% 
          uncount(1e6)
df1$Date <- as.Date(df1$Date)
system.time({df1 %>%
               mutate(DayDate=day(Date)) %>%
               mutate(MonthDate=month(Date)) %>%
               unite(DayMonth, c("DayDate", "MonthDate"), sep = "-")
                })
# user  system elapsed 
#  1.998   0.030   2.014 

system.time({df1 %>%
                mutate(DayMonth = format(Date, "%d-%m"))})
#   user  system elapsed 
#  1.119   0.001   1.118 

数据

df <- structure(list(ID = 1:3, Date = c("2004-02-06", "2006-03-14", 
"2007-07-16")), row.names = c(NA, -3L), class = "data.frame")

我不知道是谁投了票,但我看到的是OP提出了一个性能问题,而上面的第一个回答没有展示速度比较。解决方案可能是运行a)OP变异,b)dplyr格式化,c)baseR,d)paste等,并获得一些时间测量。 - donPablo

1
其他选择是:

date <-  df %>% as.Date(paste0(as.character(day(Date)), '-',as.character(month(Date))), format='%d-%m')


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