본문 바로가기
자료분석 및 코딩/파이썬

[파이썬] 4-1. 조위 자료 분석 - 텍스트 읽기, pandas, read_csv, 인코딩 및 옵션

by 아다콘다 2023. 4. 4.

 파이썬으로 실제 데이터를 읽고 처리하는 방법에 대해 소개해볼텐데, 첫번째로 해양데이터 중 가장 기초적인 정보에 해당하는 조위정보를 읽어오는 과정을 진행해보려한다. 조위정보는 국립해양조사원에서 무료로 제공해주는데, 국립해양조사원 바다누리 해양정보 서비스에 가면 다운로드 받을 수 있다. 로그인이 필요하며, 해양정보다운로드 페이지로 가서 관측자료, 월별/년별, 관측소유형(조위관측소), 관측소 선택, 연도를 선택하여 검색한 뒤 다운받으면 된다.

국립해양조사원 바다누리 해양정보 서비스 - 조위정보 다운로드

텍스트 자료 읽기 - text read (판다스, Pandas, read_csv)

 Pandas를 이용해서 텍스트 데이터를 읽을텐데, 판다스는 시계열(time series)이나 표(table) 형태의 데이터를 처리할 때 매우 유용하게 쓰이는 파이썬 패키지이다. 자연과학 분야에서 배포되는 데이터들은 대부분 기초적인 가공을 거쳐 csv나 txt 파일로 제공될텐데, 탭 또는 특정 기호로 구분된 행렬 형태이므로 Pandas를 활용하여 분석하는게 편리하다. 만약 본인의 개발환경에 판다스가 설치되어 있지 않다면, pip install pandas 입력하여 설치하면 된다. 아나콘다를 사용한다면 아마 기본적으로 함께 설치가 되어 있을 것이다. 

 다시 데이터로 돌아와서 바다누리 해양정보 서비스에서 다운받은 조위자료는 위 사진과 같이 txt 형식의 시계열 데이터이다. 시간에 따른 조위 시계열 정보로써 각 데이터들은 탭으로 구성되어 있다. 따라서 위에 언급한 행렬형태의 txt이므로 판다스의 read_csv를 활용하여 읽는 것이 편리하다.

 

1. 판다스 불러오기 : import pandas as pd

 먼저, 판다스패키지를 불러와야한다. 파이썬에서 패키지나 툴을 불러올 때는 import로 읽어오는데, import pandas as pd 와 같이 패키지를 불러온다. pandas를 불러와서 pd라는 약자로 사용하겠다는 의미이다. 판다스 내의 read_csv를 사용할 때, 원래대로라면 pandas.read_csv(~~~)라고 입력해야하지만 pandas를 pd로 정의했기 때문에 pd.read_csv와 같이 간단하게 사용하면 된다.

import pandas as pd

 

2. 텍스트 데이터 불러오기 : pd.read_csv

 텍스트 데이터를 불러오는 함수는 read_csv이다. 함수 이름처럼 txt데이터가 아니더라도 csv처럼 구분자로 구분된 형식의 데이터를 불러온다. read_csv(파일, 구분자, 헤더....기타옵션)으로 사용한다. '명령어와 파일경로 및 이름, 구분자 옵션, 헤더옵션'을 입력하면 된다. 바다누리에서 수집한 조위데이터의 파일이름은 'data_2023_DT_DT_78_202301_KR.txt' 이고, 구분자는 탭(공백), 헤더는 3줄이다. 따라서, 이 데이터를 읽는 코드는 아래와 같다.

t_data = pd.read_csv('./data_2023_DT_DT_78_202301_KR.txt', sep='\t', header=3, encoding='cp949')

 

  • sep='\t'

 sep 옵션은 구분자 옵션으로 해당 파일은 탭으로 열이 구분되어 있다. 텍스트 형식의 데이터들은 탭이나 콤마(,), 탭, 띄어쓰기 등 특정 기호나 공백으로 열을 구분하여 저장한다. 탭이란 일정 간격의 공백을 의미하는데 보통 띄어쓰기 4칸의 공백이다. 이러한 열을 구분하는 기준을 구분자라고 하며, 어떠한 기준으로 열이 나누어져있는지 확인하여 sep이란 구분자 옵션을 입력해줘야 한다. 맨위에 사진 우측의 데이터 형태를 보면 탭 공백으로 구분되어 있는 것을 확인할 수 있는데, 이 데이터의 열 구분자는 탭이므로 sep='\t' 과 같이 옵션을 주면 된다. 콤마라면 sep=',' 띄어쓰기라면 sep=' ' 과 같이 입력하면 된다.

 

  • header=3

 헤더옵션이다. 헤더란 보통 데이터의 부가정보나 각 열의 이름, 정보 등을 의미한다. 보통 텍스트 데이터들은 첫행에 헤더정보, 다음 행부터 실제 값들을 저장한다. 따라서 헤더 옵션을 주면 특정 행을 헤더로 인식하고 그 아래 데이터들을 실제 값으로 불러오는 것이다.

 실제 데이터를 열어보면 위 사진과 같이 4번째 행이 헤더(열이름)인 것을 알 수 있다. 따라서 헤더옵션을 3으로 주면 된다. 파이썬은 0부터 시작하므로 4번째 행일때는 3(0,1,2,3)이 된다.

 

  • encoding='cp949'

 자주쓰는 옵션은 아니지만 마지막 encoding 옵션을 주는 이유는 윈도우와 리눅스의 인코딩 방식이 다르기 때문이다. 해당 파일은 윈도우에서 생성했기 때문에 인코딩 형식이 cp949로 되어 있지만, 리눅스에서는 UTF-8로 인코딩하기 때문에 인코딩 옵션 없이 읽을 경우에는 아래와 같은 에러가 발생할 수 있다. 만약 아래와 같은 에러가 발생했다면, 인코딩 옵션을 확인해야 한다.

read_csv 인코딩 오류 - utf-8, cp949

 

 인코딩 옵션을 주고 조위파일을 읽으면 아래와 같이, t_data라는 변수로 저장된 모습을 확인할 수 있다.

pandas read_csv로 읽은 조위정보 변수 화

 

3. 기타옵션

 그 외에도 많은 옵션들이 있다. 보통 구분자, 헤더, 인코딩 정도의 옵션만 사용해도 데이터를 읽고 분석하는데에는 큰 문제가 없지만 그 밖에 자주 쓰이는 옵션에 대해 아래에 정리해보았다.

3.1) 구분자 - sep, delimiter

 구분자는 sep 또는 delimiter로 옵션을 지정하는데 두 옵션의 차이는 없다. 보통 sep을 더 많이 쓴다. 위 조위정보는 구분자가 탭(공백)으로 되어 있으므로 sep = '\t' 으로 옵션을 준다고 서술하였다. 처음 코딩을 할 때, 슬래시와 역슬래시가 헷갈릴 수 있는데 역슬래시는 키보드 엔터 위에 있는 원(₩) 키로 입력하면 된다. 

 

3.2) usecols

 usecols 옵션은 데이터 중 특정 열들만 불러올 때 사용한다. usecols='불러올 열들의 이름' 을 입력하면 된다. 위에서 처리한 데이터는 헤더가 한글로 입력되어 있는데, 리눅스의 스파이더에서는 한글입력이 되지 않는다. 따라서 아래 사진과 같은 임의의 테스트 데이터로 예를 들어보겠다.

 위 데이터에서 time과 tide만 읽고 싶다면, usecols=['time', 'tide']와 같이 옵션을 주면 된다. 만약, time과, temp, wspeed만 읽고 싶다면 usecols=['time', 'temp', 'wspeed']

t_data2 = pd.read_csv('./tide_test.txt', sep='\t', header=3, usecols=['time','tide'])
t_data3 = pd.read_csv('./tide_test.txt', sep='\t', header=3, usecols=['time','temp','wspeed'])

 

3.3) names

 names 옵션을 불러올 열이름을 새로 지정한다. 위 예시로 든 데이터를 보면 time, tide, temp...~총 15개의 열로 구성되어 있는데, 각 열의 이름을 A1부터 A15까지로 변경해보겠다.

t_data2 = pd.read_csv('./tide_test.txt', sep='\t', header=3, names=['A1','A2','A3','A4','A5','A6','A7','A8','A9','A10','A11','A12','A13','A14','A15'])

 위와 같이 불러올 열이름을 지정해줄 수 있다. usecols와 같이 원하는 열만 원하는 이름으로 불러올 수 있다. 

 

3.4) index_col

 index_col옵션을 데이터 중 행이름이 되는 맨 좌측의 index를 강제로 지정해주는 옵션이다. 이 옵션없이 읽었을 때는 위의 사진같이 번호로 index를 메기거나 헤더가 없을 때는 맨 좌측열을 index로 지정한다. 본 데이터는 헤더가 있기 때문에 각 행의 번호로 인덱스가 지정되었다. 만약 index_col을 0으로 준다면(index_col=0) 아래사진과 같이 첫번째 열인 시간정보가 인덱스로 지정된다.

 만약, index_col을 2나 3으로 준다면 2번째 또는 3번째 열을 index로 지정하고 그 밖의 데이터들만 칼럼으로 읽게 된다.

 

3.5) skiprows & nrows

 skiprows 옵션은 상위 행들을 건너띄고 자료를 불러들일때 활용한다. 위 샘플데이터는 2023년 1월 1일 00시부터 1분 간격의 데이터인데, 상위 5개의 데이터를 건너띄고 1시 5분부터의 데이터를 불러오고 싶다면 skiprows=5 와 같이 옵션을 입력하면 된다. 반대로 nrows는 읽으려는 파일의 행수를 지정하는 옵션이다. nrows=5 와 같이 입력하면, 상위 5개의 행만 읽어온다.

t_data = pd.read_csv('./tide_test.txt', sep='\t', header=3)
t_data2 = pd.read_csv('./tide_test.txt', sep='\t', header=3, skiprows=5)
t_data3 = pd.read_csv('./tide_test.txt', sep='\t', header=3, nrows=5)

 

다음에는 read_csv로 읽은 데이터를 바탕으로 datetime 시간 변환하여 시계열 plot을 그려보도록 하겠다.

반응형