提问人:hbtf.1046 提问时间:4/12/2016 最后编辑:Braiamhbtf.1046 更新时间:8/30/2022 访问量:340239
从日期提取年份
Extract year from date
问:
如何从变量中删除第一个元素,尤其是当此变量具有特殊字符时。例如,我有以下列:
Date
01/01/2009
01/01/2010
01/01/2011
01/01/2012
我需要一个新列,如下所示:
Date
2009
2010
2011
2012
答:
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.table
IDate
?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
评论
format
gsub(".*/","",df$Date)
substr(as.character(....), 7, 10)
lubridate::year
一旦数据按照@akrun的建议采用“日期”格式,也应该这样做。Date
format
x <- as.Date("01/01/2009", format = "%m/%d/%Y"); lubridate::year(x)