在R语言中从日期提取月份和年份

74

我已尝试了多种方法,但都无济于事。我的数据是以日期(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
...   ...          ...

我希望通过一段时间内接收的订单数量,计算出每月平均赚取的金额。如果能得到任何帮助或正确的方向指引,将不胜感激。


6个回答

140

这将以指定格式向您的 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") ]

“format”的缺点在于失去了“日期”类型,它转换成“字符”。 - Julien

19

这里有另一种解决方案,使用一个专门用于在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包(v0.3.0)在2020年9月1日创建的。


11

使用子字符串?

d = "2004-02-06"
substr(d,0,7)
>"2004-02"

7

zoo 包中的 as.yearmon 函数可以帮助进行转换。

require(zoo)

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


1
如果需要月份名称而不是数字,就像在重复分类问题从R中的日期时间中提取月份和年份中一样,可以使用format%B%b来实现。
date <- as.Date(c("2011-10-20", "2011-12-25", "2012-04-15"))

format(date, "%Y %B %b %m")
#[1] "2011 October Oct 10"  "2011 December Dec 12" "2012 April Apr 04"

哪里

  • %Y 年份
  • %B 当前语言环境下的完整月份名称
  • %b 当前语言环境下的缩写月份名称
  • %m 以十进制数表示的月份

有关格式的文档可以在 strptime, strftime 中找到。

此外,当前语言环境中的月份名称可以使用 months 提取。

months(date)
#[1] "October"  "December" "April"

要将其翻译成其他语言,可以使用Sys.setlocale
Sys.setlocale("LC_TIME", "de_DE.UTF-8")

format(date, "%Y %B %b %m")
#[1] "2011 Oktober Okt 10"  "2011 Dezember Dez 12" "2012 April Apr 04"

months(date)
#[1] "Oktober"  "Dezember" "April"   

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') ]

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