zoo :: yearmon 객체에서 월과 연도 추출


112

나는이 yearmon개체를 :

require(zoo)
date1 <- as.yearmon("Mar 2012", "%b %Y")
class(date1)
# [1] "yearmon"

여기에서 월과 연도를 어떻게 추출 할 수 있습니까?

month1 <- fn(date1)
year1 <- fn(date1)

대신 어떤 기능을 사용해야합니까? fn()

답변:


143

format()클래스의 객체에 메서드를 사용합니다 "yearmon". 다음은 귀하의 예시 날짜입니다 (제대로 생성되었습니다!).

date1 <- as.yearmon("Mar 2012", "%b %Y")

그런 다음 필요에 따라 날짜 부분을 추출 할 수 있습니다.

> format(date1, "%b") ## Month, char, abbreviated
[1] "Mar"
> format(date1, "%Y") ## Year with century
[1] "2012"
> format(date1, "%m") ## numeric month
[1] "03"

이들은 문자로 반환됩니다. 적절한 as.numeric()경우 연도 또는 숫자 월을 숫자 변수로 원하면 줄 바꿈하십시오.

> as.numeric(format(date1, "%m"))
[1] 3
> as.numeric(format(date1, "%Y"))
[1] 2012

자세한 내용은 ?yearmon?strftime참조-후자는 사용할 수있는 자리 표시 자 문자를 설명합니다.


4
즉, 월 "대신" "월"의 전체 월 %의 B
PatrickT

vectorn 개의 요소 가 있으면 어떻게 1k 날짜를 하나에 넣을 수 vector있습니까?
Stophface 2015

@Chrissl은 많은 R과 마찬가지로 date1날짜 벡터 일 수도 있습니다.
Gavin Simpson

101

lubridate 패키지는 이런 종류의 일은 놀랍습니다 :

> require(lubridate)
> month(date1)
[1] 3
> year(date1)
[1] 2012

2
이 답변에 감사드립니다. if (year (date1)> 2014) {year (date1) <-year (date1)-100}
Vincent

1
이것은 4000 계약의 시작 날짜 중 1 년을 가져 가라는 내 요구 사항에 대한 최고의 대답이었습니다.
d8aninja 2015 년

@Ari B. Friedman 저는 현재 R 3.1.0을 사용하고 있지만 이것은 lubridate패키지를 지원하지 않고 이것을 설치하려고 시도했고 연도 (날짜)를 사용했지만 연도 대신 날짜를 제공합니다. 형식이 "2015-05"인 날짜에만 작동합니다. -06 "?
KRU

1
@KRU R의 새 버전은 저장소가 모든 패키지를 업데이트하는 데 몇 주가 걸리는 경우가 있습니다. 문자형 벡터가 아닌 실제 날짜 형식이면 모든 날짜 형식에서 작동합니다. 그래도 문제가 해결되지 않고 질문의 두 구성 요소를 검색 할 수없는 경우 새 q를 게시하십시오.
Ari B. Friedman

15

OP가 zoo여기에서 사용하고 있음을 알고 있지만 ts동일한 문제에 대한 표준 솔루션을 검색하는 스레드를 발견했습니다 . 그래서 나는 zoo무료 답변을 추가 할 것이라고 생각했습니다 ts.

# create an example Date 
date_1 <- as.Date("1990-01-01")
# extract year
as.numeric(format(date_1, "%Y"))
# extract month
as.numeric(format(date_1, "%m"))

12

다음을 사용할 수 있습니다 format.

library(zoo)
x <- as.yearmon(Sys.time())
format(x,"%b")
[1] "Mar"
format(x,"%Y")
[1] "2012"

월이 숫자가되도록하려면 어떻게해야합니까? (예를 들어 월 3?)
adam.888

@ user1169210 내 대답에서 이것을 다뤘습니다. as.numeric(format(x, "%m"))예를 들어 월을 숫자로 원합니다 .
Gavin Simpson

5

큰 벡터의 경우 :

y = as.POSIXlt(date1)$year + 1900    # x$year : years since 1900
m = as.POSIXlt(date1)$mon + 1        # x$mon : 0–11

1
R은 이미 편리하게 제공하기 때문에 이것은 가장 좋은 대답이다 POSIXlt동물원 패키지가 불필요하게 객체
마르코 Demaio

0

질문은 예상되는 출력을 정확하게 나타내지 않았지만 월에는 월 번호 (1 월 = 1)를 원하고 연도에는 숫자 4 자리 연도를 원한다고 가정 한 다음 질문의 코드를 방금 실행했다고 가정합니다.

cycle(date1)
## [1] 3
as.integer(date1)
## [1] 2012

0

1800 년부터 지금까지 데이터에 비슷한 문제가 있었기 때문에 이것은 저에게 효과적이었습니다.

data2$date=as.character(data2$date) 
lct <- Sys.getlocale("LC_TIME"); 
Sys.setlocale("LC_TIME","C")
data2$date<- as.Date(data2$date, format = "%Y %m %d") # and it works
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.