programing

동물원에서 월 및 연도 추출:: yearmon 개체

bestprogram 2023. 7. 6. 22:27

동물원에서 월 및 연도 추출:: yearmon 개체

나는 있습니다yearmon객체:

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

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

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

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

사용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자세한 내용은 후자에서 사용할 수 있는 자리 표시자 문자를 설명합니다.

윤활유 패키지는 다음과 같은 것에 매우 유용합니다.

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

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"))

사용할 수 있습니다.format:

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

큰 벡터의 경우:

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

의견에 따라 결과는 월 번호(1월 = 1)와 4자리 연도가 되어야 하므로 질문에서 코드를 실행했다고 가정하면 다음과 같습니다.이는 질문에 이미 사용된 것 외에 추가 패키지를 사용하지 않으며 매우 짧고 다른 솔루션보다 훨씬 빠릅니다(아래 벤치마크 섹션 참조).

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

벤치마크

길이가 1000인 연도별 개체에서 위의 솔루션은 연도별로 다른 솔루션보다 약 1000배, 월별로 200배 빠릅니다.

library(zoo)
library(microbenchmark)
library(lubridate)

ym <- as.yearmon(rep(2000, 1000))

microbenchmark(
  as.integer(ym),
  as.numeric(format(ym, "%y")),
  as.POSIXlt(ym)$year + 1900,
  year(ym)
)

Unit: microseconds
                         expr     min       lq     mean   median       uq     max neval cld
               as.integer(ym)    18.2    27.90    28.93    29.15    31.15    51.2   100 a  
 as.numeric(format(ym, "%y")) 46515.8 47090.05 48122.28 47525.00 48080.25 69967.6   100   c
   as.POSIXlt(ym)$year + 1900 40874.4 41223.65 41798.60 41747.30 42171.25 44381.2   100  b 
                     year(ym) 40793.2 41167.70 42003.07 41742.40 42140.30 65203.3   100  b 
 
microbenchmark(
  cycle(ym),
  as.numeric(format(ym, "%m")),
  as.POSIXlt(ym)$mon + 1,
  month(ym)
)

Unit: microseconds
                         expr     min      lq      mean   median       uq     max neval cld
                    cycle(ym)   138.1   166.0   173.893   172.95   181.45   344.0   100 a  
 as.numeric(format(ym, "%m")) 46637.1 46954.8 47632.307 47325.90 47672.40 67690.1   100   c
       as.POSIXlt(ym)$mon + 1 40923.3 41339.1 41976.836 41689.95 42078.15 65786.4   100  b 
                    month(ym) 41056.4 41408.9 42082.975 41743.35 42164.95 66651.0   100  b 

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

언급URL : https://stackoverflow.com/questions/9749598/extract-month-and-year-from-a-zooyearmon-object