[r] 연도와 월 ( “yyyy-mm”형식)을 날짜로 변환 하시겠습니까?
다음과 같은 데이터 세트가 있습니다.
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 ()도 하루가 필요하고 그날의 표준 값을 설정할 수 없습니까? 내 문제를 해결하는 기능은 무엇입니까?
답변
이 시도. (여기 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"
노트 :
-
"yearmon"
클래스 객체는 달력 순서로 정렬됩니다. -
이것은 월간 포인트를 원하는 간격으로 동일한 간격으로 표시합니다. 그러나 매월 일 수에 비례하여 간격이 다른 간격으로 점을 플로팅하려면의 인덱스
z
를"Date"
class : 로 변환하십시오time(z) <- as.Date(time(z))
.
답변
날짜는 숫자 값과 시작 날짜에 해당하므로 실제로 날짜가 필요합니다. 데이터가 날짜 형식이어야하는 경우 날짜에 붙여 넣어 수동으로 매월 1 일로 날짜를 수정할 수 있습니다.
month <- "2009-03"
as.Date(paste(month,"-01",sep=""))
답변
날짜가 날짜 형식이어야하는 경우 가장 간결한 솔루션 :
library(zoo)
month <- "2000-03"
as.Date(as.yearmon(month))
[1] "2000-03-01"
as.Date
매월 첫날을 yearmon 개체로 수정합니다.
답변
-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")
답변
언제든지 패키지 사용 :
library(anytime)
anydate("2009-01")
# [1] "2009-01-01"
답변
실제로 위에서 언급했듯이 (및 SO의 다른 곳에서) 문자열을 날짜로 변환하려면 특정 날짜가 필요합니다. 로부터 as.Date()
매뉴얼 페이지 :
날짜 문자열이 날짜를 완전히 지정하지 않는 경우 반환되는 답변은 시스템별로 다를 수 있습니다. 가장 일반적인 동작은 누락 된 연도, 월 또는 일이 현재 것이라고 가정하는 것입니다. 날짜를 잘못 지정하면 신뢰할 수있는 구현에서 오류가 발생하고 날짜가 NA로보고됩니다. 불행히도 일부 일반적인 구현 (예
glibc
:)은 신뢰할 수 없으며 의도 한 의미를 추측합니다.
간단한 해결책은 날짜 "01"
를 각 날짜 에 붙여넣고 strptime()
해당 월의 첫 번째 날로 표시하는 데 사용 하는 것입니다.
R에서 날짜 및 시간 처리에 대한 배경 지식이 더 필요한 경우 :
R에서 시간 사용 POSIXct
과 POSIXlt
클래스 및 날짜는 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"
답변
@ 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"))