r, python

python] rpy2 를 통해 readRDS사용시, tzone 관련 오류 : vectors.py 파일을 수정 (eng explanations included)

ysLog 2022. 4. 13. 12:09

# 요약 (summary)

 

rpy2 패키지에 포함된 vectors.py 파일을 강제로 수정한다

  * vectors.py 파일의 982행의 값을 r_tzone_name = "UTC" 등으로 수정

 

If you encountered following errors,

setting "r_tzone_name" variable at row 982 of "vectors.py" file which is included in the rpy2 package as the time zone name that you want to set (ex: "UTC")  will fix this issue.

If you want to need more detailed information, please see the images in this content.

 

 

------------

# 기초정보 (baseline information of this situation)

* .rds 파일을 python에서 읽어오려는 상황 (python3)

* rds 파일 관련 정보

  * 해당 시간정보는 R에서 POSIXct 형으로 저장되어 있음

    * 이 파일은 KO-KR 환경의 윈도우10 PC에서 작업하여 저장된 파일

    * 한국시각대 정보일 듯

--------------

# 오류발생상황 (situations of the error)

* 1번 유형 : R 에서 저장한 "시간 정보"를 포함한 RDS파일을 python에서 불러올 때

* 2번 유형 : 불러온 rds파일을 python에서 호출할 때

 

## 오류 1번

* 최초 파일을 읽을 때 다음과 같은 오류 발생

```

(파이썬 설치 경로. 윈도우의 경우 C:\Users\개인계정 )\AppData\Roaming\Python\Python37\site-packages\rpy2\robjects\vectors.py:980: UserWarning: R object inheriting from "POSIXct" but without attribute "tzone".
  warnings.warn('R object inheriting from "POSIXct" but without '

 

```

 

## 오류 2번

* 아래와 같은 오류가 변수 1개마다 반복해서 발생하고, 해당 변수의 tz, tzinfo 값이 N

  * 만약 1000행짜리 데이터프레임에 POSIXct (시간정보) 변수가 2000개 있으면, 2000번 아래의 오류메세지가 표출되는것 같음

```

Traceback (most recent call last):
  File "pandas\_libs\tslibs\timezones.pyx", line 266, in pandas._libs.tslibs.timezones.get_dst_info
AttributeError: 'NoneType' object has no attribute 'total_seconds'
Exception ignored in: 'pandas._libs.tslibs.conversion._localize_tso'
Traceback (most recent call last):
  File "pandas\_libs\tslibs\timezones.pyx", line 266, in pandas._libs.tslibs.timezones.get_dst_info
AttributeError: 'NoneType' object has no attribute 'total_seconds'

```

 

터미널에서 확인되는 오류

 

### 오류발생 원인 (reason of the attribute error occurence)

해당 변수를 확인하면 보이는 오류
tz, tzinfo 값이 None 임

 

--------------

# 문제해결법 (how to solve) : rpy2 의 구성요소인 "vectors.py" 파일 982행을 강제 수정

* 다음 경로에 있는 vectors.py 파일의 982행에 r_tzone_name 변수를 상황에 맞는 timezone 값으로 강제 지정하기

(파이썬 설치 경로. 윈도우의 경우 C:\Users\개인계정 )\AppData\Roaming\Python\Python37\site-packages\rpy2\robjects\vectors.py

rpy2 의 구성요소인 vectors.py 원본 코드

 

## vectors.py 강제수정 절차

* vectors.py 파일 열기

  * 경로 : 윈도우의 경우 C:\Users\개인계정 )\AppData\Roaming\Python\Python37\site-packages\rpy2\robjects\ 하위에 있음

  * 주의

    * 본인이 설치한 python 경로에 따라 위 경로는 다를 수 있음

    * 본인이 사용중인 python 버전에 따라 위 경로의 폴더 중 "Python37"은 "Python37"이 아닌 python38, pyton310 등 다른 값일 수 있음

    * 개인계정 하위의 "AppData" 폴더는 숨김 폴더라 숨김폴더 보는 옵션을 설정해야 함

 

* 982행의 r_tzone_name = '' 찾기

* r_tzone_name 값이 원하는 값으로 변경되도록 처리

* 예 : Asia/Seoul 로 변경하는 경우

  * r_tzone_name = "Asia/seoul'

  * 수정 잘 되는지 확인하기 위해, 981에 아래 사진과 같이 원하는 문구를 추가해도 좋음

----

## 문제해결 결과 (error handling result)

* 위 오류상황 중 **오류 1번** 은 위의 사진처럼 수정된 메세지가 뜸.

* 그러나 **오류 2번** 은 해결됨

timezone 값이 추가되어있음
tz, tzinfo 값도 잘 들어가있음

------

## 참고 : python 에서 .rds 파일 읽기 (appendix: how to read .rds file in python3)

import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()
readRDS = robjects.r['readRDS']
 
mydata = readRDS("targetFile.rds")
 

## 참고 2 : 최신 rpy2를 활용해 python에서 .rds 파일을 읽어왔는데, python의 변수를 접근해보면 데이터프레임형식이 아닌 다른 형식으로 저장되는 경우

  • rpy2 3.4.5 버전을 사용하면 문제없이 사용 가능
    • 설치 시 다음과 같이 버전을 명시해주면 됨 (기존버전이 설치된 경우 기존버전 rpy2 를 설치한 후 재설치 할 것)
      • pip3 install rpy2==3.4.5
    • 현재 설치된 rpy2 버전 확인법
      • 다음과 같이 치면 표출됨
        • import rpy2
        • rpy2.__version__
    • 2022-04-06 현재 rpy2를 pip로 설치하면 최신버전인 3.5.0이 설치됨
      • 이 버전의 문제는, readRDS로 읽은 결과파일이 데이터프레임이 아닌 다른 형식으로 읽힘
      • 읽힌 데이터의 각 열 순서대로 리스트로 저장되어있어서 별도로 수정을 해줘야 함
        • myData = readRDS("sth.rds")
        • myData[0] # : 첫번째 열