날짜에서 연도 추출


82

특히이 변수에 특수 문자가있는 경우 변수에서 첫 번째 요소를 제거하려면 어떻게해야합니까? 예를 들어, 다음 열이 있습니다.

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

다음과 같은 새 열이 필요합니다.

Date
2009
2010
2011
2012

13
'Date'클래스로 변환 format하고 '연도'추출에 사용
akrun

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

2
또는substr(as.character(....), 7, 10)
jogo apr

6
lubridate::year데이터가 @akrun에서 제안한 '날짜'형식이면 트릭을 수행해야합니다.
fdetsch

6
가장 깨끗한 해결책은 해당 변수를 강제로 Date사용하고 일부 format또는 다른 함수를 사용하여 일부를 추출하는 것입니다. 예 : x <- as.Date("01/01/2009", format = "%m/%d/%Y"); lubridate::year(x).
Roman Luštrik

답변:


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

178

주석에서 논의했듯이 항목을 Date형식 으로 변환 하고 연도를 추출하면 다음과 같이 수행 할 수 있습니다 .

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

7
도대체이게 작동하는 이유는 무엇입니까? 내가 보는 경우 format()의 문서, 아무것도 당신이 한 것으로 두 번째 인수에 대해 말했다있다. 이것을 어떻게 이해해야합니까?
scarface

16
From ?format: "형식은 일반 함수 입니다. 여기에 설명 된 방법 외에도 날짜에 대한 방법이 있습니다 ( format.Date 참조 )". From ?format.Date: "## 클래스 ' Date'format (x, ...)에 대한 S3 메서드 [여기서 ...는] as.character 및 as.Date 메서드의 형식을 포함 하여 다른 메서드에서 또는 다른 메서드로 전달할 추가 인수 입니다. ". 의 첫 번째 예를 참조하십시오 ?format.Date.
RHertel


27

변수를 Date다음으로 변환 할 때 :

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

그런 다음 원하는 요소를 잘라 내고 연도와 같은 새 변수를 만들 수 있습니다.

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

또는 월 :

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

4

datepackage를 사용한다면 이것은 상당히 쉽게 할 수 있습니다.

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

이것은 특정 답변보다 더 많은 조언이지만 내 제안은 날짜를 문자열로 유지하는 대신 날짜를 날짜 변수로 즉시 변환하는 것입니다. 이렇게하면 매우 번거로운 해결 방법을 사용하지 않고 날짜 (및 시간) 기능을 사용할 수 있습니다.

지적했듯이 윤활유 패키지에는 좋은 추출 기능이 있습니다.

일부 프로젝트의 경우 시작부터 날짜를 연결하는 것이 도움이된다는 사실을 발견했습니다. 시작할 연도, 월, 일 (월) 및 일 (주) 변수를 만듭니다. 추출 코드가 요약 / 표 / 그래프 코드와 분리되어 있고 변경해야하는 경우 여러 지점에서 이러한 변경 사항을 롤아웃 할 필요가 없기 때문에 요약, 표 및 그래프를 단순화 할 수 있습니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.