从日期提取年份

Extract year from date

提问人:hbtf.1046 提问时间:4/12/2016 最后编辑:Braiamhbtf.1046 更新时间:8/30/2022 访问量:340239

问:

如何从变量中删除第一个元素,尤其是当此变量具有特殊字符时。例如,我有以下列:

Date
01/01/2009
01/01/2010
01/01/2011
01/01/2012

我需要一个新列,如下所示:

Date
2009
2010
2011
2012
r

评论

14赞 akrun 4/12/2016
转换为“Date”类并用于提取“year”format
5赞 mtoto 4/12/2016
gsub(".*/","",df$Date)
2赞 jogo 4/12/2016
substr(as.character(....), 7, 10)
7赞 fdetsch 4/12/2016
lubridate::year一旦数据按照@akrun的建议采用“日期”格式,也应该这样做。
6赞 Roman Luštrik 4/12/2016
最干净的解决方案是强制该变量并使用任一函数或其他函数来提取它的一部分。例如。Dateformatx <- as.Date("01/01/2009", format = "%m/%d/%Y"); lubridate::year(x)

答:

27赞 Alexander 4/12/2016 #1

如果所有日期的宽度相同,则可以将日期放在向量中并使用子字符串

Date
a <- c("01/01/2009", "01/01/2010" , "01/01/2011")
substring(a,7,10) #This takes string and only keeps the characters beginning in position 7 to position 10

输出

[1] "2009" "2010" "2011"

评论

1赞 Dr. Fabian Habersack 10/5/2018
我同意,但你可以很容易地将其转换为数字向量,不是吗?as.numeric(substring(a,7,10))
8赞 skoh 1/15/2019
日期不应转换为字符串或数字;它们本质上是“自固定时间点以来的 x(秒数)”,并显示为人类可读的字符串 - 严格不能作为字符串进行操作。
235赞 RHertel #2

正如评论中所讨论的,这可以通过将条目转换为格式并提取年份来实现,例如:Date

format(as.Date(df1$Date, format="%d/%m/%Y"),"%Y")

评论

7赞 scarface 1/22/2018
这到底是怎么回事?如果我看一下文档,你提供的第二个论点什么也没说。我应该如何理解这一点?format()
18赞 RHertel 1/22/2018
From : “format 是一个通用函数。除了这里描述的方法之外,还有一些日期的方法(见格式。日期)”。From : “## 类 'Date' 格式的 S3 方法(x, ...)[其中......表示]要从其他方法传递或传递到其他方法的进一步参数,包括 as.character 和 as 的格式。Date 方法。另请参见中的第一个示例。?format?format.Date?format.Date
85赞 Ajay Ohri 4/10/2017 #3
library(lubridate)
a=mdy(b)
year(a)

https://cran.r-project.org/web/packages/lubridate/vignettes/lubridate.html http://vita.had.co.nz/papers/lubridate.pdf

41赞 invictus 11/16/2018 #4

当您将变量转换为:Date

date <-  as.Date('10/30/2018','%m/%d/%Y')

然后,您可以剪切所需的元素并创建新变量,例如 year:

year <- as.numeric(format(date,'%Y'))

或月份:

month <- as.numeric(format(date,'%m'))
4赞 Barry DeCicco 2/2/2019 #5

这更像是一个建议,而不是一个具体的答案,但我的建议是立即将日期转换为日期变量,而不是将它们保留为字符串。这样,您就可以对它们使用日期(和时间)函数,而不是尝试使用非常麻烦的解决方法。

如前所述,润滑油包具有很好的提取功能。

对于某些项目,我发现从一开始就拼凑日期是有帮助的: 创建 year、month、day(of month)和 day(of week)变量以开始。 这可以简化摘要、表格和图表,因为提取代码与摘要/表格/图形代码是分开的,并且因为如果需要更改它,则不必在多个位置推出这些更改。

4赞 gung - Reinstate Monica 6/13/2019 #6

如果您使用的是日期,这可以很容易地完成。

library(date)
Date <- c("01/01/2009", "01/01/2010", "01/01/2011", "01/01/2012")
Date <- as.date(Date)
Date
# [1] 1Jan2009 1Jan2010 1Jan2011 1Jan2012
date.mdy(Date)$year
# [1] 2009 2010 2011 2012

## be aware that these are now integers and thus different methods may be invoked:
str(date.mdy(Date)$year)
# int [1:4] 2009 2010 2011 2012
summary(Date)
#     First      Last   
# "1Jan2009" "1Jan2012" 
summary(date.mdy(Date)$year)
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#    2009    2010    2010    2010    2011    2012 
3赞 andschar 9/12/2020 #7

在一段时间内,您也只能依赖包及其类以及相关函数 (Check )。data.tableIDate?as.IDate()

require(data.table)

a <- c("01/01/2009", "01/01/2010" , "01/01/2011")
year(as.IDate(a, '%d/%m/%Y')) # all data.table functions