Error in as.POSIXct.POSIXlt(what, tz = tzone) : invalid 'tz' value​

nza.RData
다운로드

파일을 다운로드한 뒤에 R에서 불러보자.

 

> load("nza.RData")
> head(nza,20)
               time   name  lbmp
1  12/01/2017 00:00 CAPITL 28.00
2  12/01/2017 00:00 CENTRL  8.96
3  12/01/2017 00:00 DUNWOD 22.16
4  12/01/2017 00:00 GENESE  8.20
5  12/01/2017 00:00    H Q  6.46
6  12/01/2017 00:00 HUD VL 21.73
7  12/01/2017 00:00 LONGIL 30.48
8  12/01/2017 00:00 MHK VL  9.03
9  12/01/2017 00:00 MILLWD 22.35
10 12/01/2017 00:00 N.Y.C. 22.27
11 12/01/2017 00:00  NORTH  6.37
12 12/01/2017 00:00    NPX 25.33
13 12/01/2017 00:00    O H  8.70
14 12/01/2017 00:00    PJM 16.12
15 12/01/2017 00:00   WEST  8.70
16 12/01/2017 01:00 CAPITL 27.50
17 12/01/2017 01:00 CENTRL  8.23
18 12/01/2017 01:00 DUNWOD 21.54
19 12/01/2017 01:00 GENESE  7.50
20 12/01/2017 01:00    H Q  5.72

 

보다시피 time별로, name별로 lbmp라는 값이 있는 데이터의 첫 20행을 본 것이다. 16번째 데이터부터 첫번째 name이 다시 반복되는 것을 보니 매 시간 열 다섯개의 name에 대해 lbmp 값이 있는 데이터로 보인다. 이 데이터를 time by name으로 바꿔서 각각의 name을 변수 이름으로 하는 hourly data로 만들고 싶을땐 어떻게 하면 될까? 바로 cast() 함수를 쓰면 된다. cast() 함수는 reshape라는 패키지에 있다.

reshape 패키지를 아직 설치하지 않았으면 설치부터 한다.

 

> install.packages("reshape")

 

설치했으면 reshape 라이브러리를 부른다.

 

> library(reshape)

 

cast() 함수의 사용 방법은 간단하다.

 

> nzb<-cast(nza,time~name,value="lbmp")
> head(nzb,20)
               time CAPITL CENTRL DUNWOD GENESE   H Q HUD VL 
1  12/01/2017 00:00  28.00   8.96  22.16   8.20  6.46  21.73  
2  12/01/2017 01:00  27.50   8.23  21.54   7.50  5.72  21.11  
3  12/01/2017 02:00  27.15   7.72  21.11   6.97  5.26  20.69  
4  12/01/2017 03:00  26.20   7.58  20.42   6.86  5.21  20.01  
5  12/01/2017 04:00  27.73   7.84  21.53   7.09  5.27  21.09  
6  12/01/2017 05:00  27.62  11.82  22.88  11.04  9.54  22.52  
7  12/01/2017 06:00  32.95  23.82  30.92  22.64 21.76  30.68  
8  12/01/2017 07:00  31.53  30.37  32.42  29.45 28.71  32.33  
9  12/01/2017 08:00  30.65  29.33  31.57  28.32 27.75  31.40  
10 12/01/2017 09:00  30.64  29.17  31.64  28.03 27.59  31.32  
11 12/01/2017 10:00  29.01  27.71  29.99  26.62 26.17  29.75  
12 12/01/2017 11:00  27.57  26.25  28.58  25.20 24.52  28.16  
13 12/01/2017 12:00  26.73  25.48  27.80  24.48 23.09  27.31  
14 12/01/2017 13:00  26.19  25.01  27.18  24.02 23.21  26.90  
15 12/01/2017 14:00  25.51  24.24  26.47  23.42 22.23  26.23  
16 12/01/2017 15:00  26.47  25.22  27.36  24.45 24.01  27.14  
17 12/01/2017 16:00  32.49  30.74  33.48  29.74 29.43  33.16  
18 12/01/2017 17:00  39.19  37.27  40.26  36.14 35.73  40.00  
19 12/01/2017 18:00  36.44  34.80  37.50  33.77 33.29  37.30  
20 12/01/2017 19:00  33.41  31.80  34.48  30.83 30.57  34.29  

 

name 필드의 값이 변수 이름이 된 것을 볼 수 있다. 다른 방법도 있긴 한데 cast()가 제일 편하기 때문에 알 필요 없다.

 

여기서 한 가지 문제가 생길 수 있다. 만약에 time 변수를 strptime() 같은 함수를 써서 POSIXlt 포맷으로 만든 경우에 cast 함수를 쓰면 다음과 같은 에러가 발생한다.

 

Error in as.POSIXct.POSIXlt(what, tz = tzone) : invalid 'tz' value

 

tz 값을 제대로 해 주면 해결이 되런지 모르겠으나 그보다 제일 편한 방법은 cast를 하기 전에 POSIXlt 포맷의 시간을 문자열로 바꿔 버리는 것이다.

 

nza$time<-as.character(nza$time)
nzb<-cast(nza, time~name value="lbmp")
nzb$time<-strptime(nzb$time, "%m/%d/%Y %H:%M")

 

원한다면 cast()를 쓰고 나서 다시 strptime()을 써서 POSIXlt 포맷으로 변환하면 된다.

'R' 카테고리의 다른 글

R, data sorting하기 order()  (0) 2018.05.21
R, data에서 특정 변수 제외하기  (0) 2018.04.12
R 시계열 데이터 변환 aggregate()  (0) 2018.03.22
R 데이터 변형하기 - subset(), which()  (0) 2018.03.19
R에서 데이터 다루기  (0) 2018.03.13
Posted by jujaeuk
,