从R中的日期中提取月份和年份

时间:2016-06-08 13:41:11

标签: r date

我尝试过多种方法无济于事。我有一个日期(YYYY-MM-DD)的数据,我试图得到的只是月份和年份,例如:MM-YYYY或YYYY-MM。

最终,我希望它看起来像这样:

ID    Date         Month_Yr
1     2004-02-06   2004-02
2     2006-03-14   2006-03
3     2007-07-16   2007-07
...   ...          ...

我这样做的目的是希望在一段时间内从一些订单中平均赚取一个月赚来的钱。任何帮助,或推动正确的方向将非常感激。

5 个答案:

答案 0 :(得分:70)

这将为您的data.frame添加指定格式的新列。

df$Month_Yr <- format(as.Date(df$Date), "%Y-%m")

df
#>   ID       Date Month_Yr
#> 1  1 2004-02-06  2004-02
#> 2  2 2006-03-14  2006-03
#> 3  3 2007-07-16  2007-07

# your data sample
  df <- data.frame( ID=1:3,Date = c("2004-02-06" , "2006-03-14" , "2007-07-16") )

一个简单的例子:

dates <- "2004-02-06"

format(as.Date(dates), "%Y-%m")
> "2004-02"

旁注: 如果您正在使用大型数据集,data.table方法可能会更快。

library(data.table)
setDT(df)[, Month_Yr := format(as.Date(Date), "%Y-%m") ]

答案 1 :(得分:4)

使用子字符串?

IMessage

答案 2 :(得分:1)

这是另一个解决方案,使用专门用于处理R中日期和时间的软件包:

library(tidyverse)
library(lubridate)

(df <- tibble(ID = 1:3, Date = c("2004-02-06" , "2006-03-14", "2007-07-16")))
#> # A tibble: 3 x 2
#>      ID Date      
#>   <int> <chr>     
#> 1     1 2004-02-06
#> 2     2 2006-03-14
#> 3     3 2007-07-16

df %>%
  mutate(
    Date = ymd(Date),
    Month_Yr = format_ISO8601(Date, precision = "ym")
  )
#> # A tibble: 3 x 3
#>      ID Date       Month_Yr
#>   <int> <date>     <chr>   
#> 1     1 2004-02-06 2004-02 
#> 2     2 2006-03-14 2006-03 
#> 3     3 2007-07-16 2007-07

reprex package(v0.3.0)于2020-09-01创建

答案 3 :(得分:1)

zoo 包具有 as.yearmon 的功能,可以帮助转换。

require(zoo)

df$ym<-as.yearmon(df$date, "%Y %m")

答案 4 :(得分:0)

data.table软件包在一段时间前引入了IDate类,并引入了类似zoo的类函数来检索月份,日期等(检查?IDate)。因此,您现在可以通过以下方式提取所需的信息:

require(data.table)
df <- data.frame(id = 1:3,
                 date = c("2004-02-06" , "2006-03-14" , "2007-07-16"))
setDT(df)
df[ , date := as.IDate(date) ] # instead of as.Date()
df[ , yrmn := paste0(year(date), '-', month(date)) ]
df[ , yrmn2 := format(date, '%Y-%m') ]