从日期中提取年份


79

如何从变量中删除第一个元素,尤其是在此变量具有特殊字符的情况下。例如,我有以下专栏:

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

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

Date
2009
2010
2011
2012

13
转换为“日期”类并用于format提取“年份”
akrun

5
gsub(".*/","",df$Date)
mtoto

2
substr(as.character(....), 7, 10)
jogo

6
lubridate::year一旦数据为@akrun建议的“日期”格式,它也应该起作用。
fdetsch '16

6
最干净的解决方案是将该变量强制转换为Date并使用一个format或其他函数来提取其一部分。例如,x <- as.Date("01/01/2009", format = "%m/%d/%Y"); lubridate::year(x)
RomanLuštrik'16

Answers:


20

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

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"

我同意,但是您可以轻松地将其转换为数值向量,不是吗?as.numeric(substring(a,7,10))
Fabian Habersack

3
日期不应转换为字符串或数字;它们本质上是“自固定时间点起x的数量(秒)”,并显示为人类可读的字符串-严格不要将其作为字符串进行操作。
skoh

175

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

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

7
为什么这会奏效?如果看一下format()的文档,那么您提供的第二个参数就什么也没有说。我应该怎么理解?
Scarface '18

16
摘自?format:“格式是一种通用函数。除了此处描述的方法外,还有用于日期的方法(请参见format.Date)”。来自?format.Date:“ ##类'Date'的S3方法format(x,...)[其中...表示]从或传递给其他方法的其他参数,包括as.character和as.Date方法的格式。 ”。另请参阅中的第一个示例?format.Date
RHertel


27

当您将变量转换为Date

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

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

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

或月份:

month <- as.numeric(format(date,'%m'))

3

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

如前所述,润滑脂包装具有良好的提取功能。

对于某些项目,我发现从一开始就进行拼写会很有用:创建年,月,日(月)和日(周)变量作为开始。这可以简化摘要,表格和图形,因为提取代码与摘要/表格/图形代码是分开的,并且因为如果需要更改它,则不必在多个位置进行这些更改。


2

如果您使用的是date,则可以轻松完成此操作。

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 

0

在一段时间内,您还只能依赖于data.table包及其IDate类以及相关功能(Check ?as.IDate())。因此,无需额外安装lubridate

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.