연도와 월 ( "yyyy-mm"형식)을 날짜로 변환 하시겠습니까?


91

다음과 같은 데이터 세트가 있습니다.

Month    count
2009-01  12
2009-02  310
2009-03  2379
2009-04  234
2009-05  14
2009-08  1
2009-09  34
2009-10  2386

데이터를 플로팅하고 싶습니다 (월은 x 값으로 계산하고 y 값으로 계산). 데이터에 차이가 있기 때문에 이달의 정보를 날짜로 변환하고 싶습니다. 나는 시도했다 :

as.Date("2009-03", "%Y-%m")

그러나 그것은 작동하지 않았습니다. 뭐가 문제 야? as.Date ()도 하루가 필요하고 그날의 표준 값을 설정할 수 없습니까? 내 문제를 해결하는 기능은 무엇입니까?

답변:


57

이 시도. (여기 text=Lines에서는 예제를 자체적으로 유지하기 위해 사용 하지만 실제로는 파일 이름으로 대체합니다.)

Lines <- "2009-01  12
2009-02  310
2009-03  2379
2009-04  234
2009-05  14
2009-08  1
2009-09  34
2009-10  2386"

library(zoo)
z <- read.zoo(text = Lines, FUN = as.yearmon)
plot(z)

X 축은이 데이터로 너무 예쁘지는 않지만 실제로 더 많은 데이터가있는 경우 괜찮을 수도 있고의 예제 섹션에 표시된 멋진 X 축에 대한 코드를 사용할 수 있습니다 ?plot.zoo.

z위에서 만든 동물원 시리즈 에는 "yearmon"시간 인덱스가 있으며 다음과 같습니다.

> z
Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009 
      12      310     2379      234       14        1       34     2386 

"yearmon" 단독으로도 사용할 수 있습니다.

> as.yearmon("2000-03")
[1] "Mar 2000"

노트 :

  1. "yearmon" 클래스 객체는 달력 순서로 정렬됩니다.

  2. 이것은 월간 포인트를 원하는 간격으로 동일한 간격으로 표시합니다. 그러나 매월 일 수에 비례하여 간격이 다른 간격으로 점을 플로팅하려면의 인덱스 z"Date"class : 로 변환하십시오 time(z) <- as.Date(time(z)).


76

날짜는 숫자 값과 시작 날짜에 해당하므로 실제로 날짜가 필요합니다. 데이터가 날짜 형식이어야하는 경우 날짜에 붙여 넣어 수동으로 매월 1 일로 날짜를 수정할 수 있습니다.

month <- "2009-03"
as.Date(paste(month,"-01",sep=""))

날짜에 다른 어떤 형식이 있습니까? POSIX와 ISO로 무언가를 보았지만 다른 형식인지 확실하지 않습니다. 나는 그것들이 단지 함수라고 생각했습니다.
R_User 2011-06-05

19
포맷터에서 요일을 동일하게 지정할 수 있으므로 as.Date(month, format='%Y-%m-01')동일한 결과를 수행 하고 달성 할 수 있습니다 . 이 "느낌"은 매월 동일한 날짜를 지정하는 것이 날짜 형식과 문자열 조작에 대한 것이기 때문에 나에게 더 바람직하지만 말도 안되는 일입니다.
JBecker 2013 년

21
@JBecker 귀하의 제안이 나를 위해 작동하지 않습니다. > as.Date("2016-01", format="%Y-%m-01") # [1] NA. 저는 R 3.3.1을 사용하고 있습니다
n8sty

26

날짜가 날짜 형식이어야하는 경우 가장 간결한 솔루션 :

library(zoo)
month <- "2000-03"
as.Date(as.yearmon(month))
[1] "2000-03-01"

as.Date 매월 첫날을 yearmon 개체로 수정합니다.


23

-package 의 parse_date_time또는 fast_strptime함수를 사용하여이를 수행 할 수도 있습니다 lubridate.

> parse_date_time(dates1, "ym")
[1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"

> fast_strptime(dates1, "%Y-%m")
[1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"

그 둘 사이의 차이 즉 parse_date_time하면서 lubridate 스타일 형식 사양 허용 fast_strptime동일한 포맷 사양이 필요 strptime.

시간대를 지정하려면- tz매개 변수를 사용할 수 있습니다 .

> parse_date_time(dates1, "ym", tz = "CET")
[1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"

날짜-시간 데이터에 truncated불규칙성이 있는 경우- 매개 변수를 사용하여 허용되는 불규칙성 수를 지정할 수 있습니다.

> parse_date_time(dates2, "ymdHMS", truncated = 3)
[1] "2012-06-01 12:23:00 UTC" "2012-06-01 12:00:00 UTC" "2012-06-01 00:00:00 UTC"

사용 된 데이터 :

dates1 <- c("2009-01","2009-02","2009-03")
dates2 <- c("2012-06-01 12:23","2012-06-01 12",'2012-06-01")

포맷으로 문자 변수로 변환하는 데 date사용하여 parse_date_time, 상이한 순서로 볼 수있는 방법이 "2009-01-01 UTC"이용 lubridate패키지? 내 데이터 세트에서 먼저 하루를보고 싶습니다 01-01-2009.
user63230 jul.

1
@ user63230 참조 ?format; 예 : format(your_date, "%d-%m-%Y"). 하지만 여기에는 단점이 있습니다. 날짜가 아닌 문자 값을 다시 얻게됩니다.
Jaap 19

고마워요.하지만 format당신이 언급 한 이유로 피하려고 했는데, 이것을 lubridate패키지 에 통합하는 방법이있을 것이라고 생각 했지만없는 것 같습니다.
user63230 jul.

12

언제든지 패키지 사용 :

library(anytime)

anydate("2009-01")
# [1] "2009-01-01"

"01-01"을 선택하는 것이 조금 이상합니다. 문서에 선택 사항에 대한 내용이 있습니까? anydate("2009-03")매월 첫날을 항상 선택하는지 보여주는 것이 더 예시적일 수 있습니다 .
lmo

@lmo는 문서를 확인하지 않았고, dd가 1 일을 선택하지 않았을 때 이것이 "일반적인"관행이라고 말하고 싶습니다.
zx8754

2
말이 되네요. 어렴풋이 기억이 나고 댓글을 촉발 한 원인을 찾았습니다. 의 참고 섹션에서 ?strptime: 입력 문자열은 완전히 날짜를 지정하지 않아도 : 지정되지 않은 초, 분 또는 시간 제로하다고 가정하고, 지정되지 않은 연도, 월, 일 현재 하나입니다. (단, 월이 지정된 경우 해당 월의 현재 날짜가 지정된 월에 유효 할 필요가 없으므로 해당 월의 날짜를 % d 또는 % e로 지정해야합니다.) 메가 트론의 답변에 비슷한 내용이 포함 된 것 같습니다 . 에서 문서 as.Date.
lmo

1900 년 이전에는 작동하지 않습니다. 예를 들어,이 시도anytime('1870-01')
msh855

5

실제로 위에서 언급했듯이 (및 SO의 다른 곳에서) 문자열을 날짜로 변환하려면 특정 날짜가 필요합니다. 로부터 as.Date()매뉴얼 페이지 :

날짜 문자열이 날짜를 완전히 지정하지 않는 경우 반환되는 답변은 시스템별로 다를 수 있습니다. 가장 일반적인 동작은 누락 된 연도, 월 또는 일이 현재 것이라고 가정하는 것입니다. 날짜를 잘못 지정하면 신뢰할 수있는 구현에서 오류가 발생하고 날짜가 NA로보고됩니다. 불행히도 일부 일반적인 구현 (예 glibc:)은 신뢰할 수 없으며 의도 한 의미를 추측합니다.

간단한 해결책은 날짜 "01"를 각 날짜 에 붙여넣고 strptime()해당 월의 첫 번째 날로 표시하는 데 사용 하는 것입니다.


R에서 날짜 및 시간 처리에 대한 배경 지식이 더 필요한 경우 :

R에서 시간 사용 POSIXctPOSIXlt클래스 및 날짜는 Date클래스를 사용합니다 .

날짜는 1970 년 1 월 1 일 이후의 일 수로 저장되고 시간은 1970 년 1 월 1 일 이후의 초 수로 저장됩니다.

예를 들면 다음과 같습니다.

d <- as.Date("1971-01-01")
unclass(d)  # one year after 1970-01-01
# [1] 365

pct <- Sys.time()  # in POSIXct
unclass(pct)  # number of seconds since 1970-01-01
# [1] 1450276559
plt <- as.POSIXlt(pct)
up <- unclass(plt)  # up is now a list containing the components of time
names(up)
# [1] "sec"    "min"    "hour"   "mday"   "mon"    "year"   "wday"   "yday"   "isdst"  "zone"  
# [11] "gmtoff"
up$hour
# [1] 9

날짜 및 시간에 대한 작업을 수행하려면

plt - as.POSIXlt(d)
# Time difference of 16420.61 days

그리고 날짜를 처리하기 위해 다음을 사용할 수 있습니다 strptime()(매뉴얼 페이지에서이 예제를 빌림) :

strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
# [1] "2006-02-20 11:16:16 EST"

# And in vectorized form:
dates <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
strptime(dates, "%d%b%Y")
# [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT"

1

@ ben-rollert의 솔루션이 좋은 솔루션이라고 생각합니다.

새 패키지 내의 함수에서이 솔루션을 사용하려면주의해야합니다.

패키지를 개발할 때 구문을 사용하는 것이 좋습니다 packagename::function_name()( http://kbroman.org/pkg_primer/pages/depends.html 참조 ).

이 경우 라이브러리 에서 as.Date()정의한 버전을 사용해야합니다 zoo.

다음은 예입니다.

> devtools::session_info()
Session info ----------------------------------------------------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.3.1 (2016-06-21)
 system   x86_64, linux-gnu           
 ui       RStudio (1.0.35)            
 language (EN)                        
 collate  C                           
 tz       <NA>                        
 date     2016-11-09                  

Packages --------------------------------------------------------------------------------------------------------------------------------------------------------

 package  * version date       source        
 devtools   1.12.0  2016-06-24 CRAN (R 3.3.1)
 digest     0.6.10  2016-08-02 CRAN (R 3.2.3)
 memoise    1.0.0   2016-01-29 CRAN (R 3.2.3)
 withr      1.0.2   2016-06-20 CRAN (R 3.2.3)

> as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) 
Error in as.Date.default(zoo::as.yearmon("1989-10", "%Y-%m")) : 
  do not know how to convert 'zoo::as.yearmon("1989-10", "%Y-%m")' to class “Date”

> zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
[1] "1989-10-01"

따라서 패키지를 개발하는 경우 다음을 사용하는 것이 좋습니다.

zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.