개요
아래와 같은 CSV 파일이 있다고 하자.
date, idx, val
1/5/2020 10:00:00, 1, 10
1/5/2020 10:10:00, 1, 12
1/5/2020 10:20:00, 1, 17
1/5/2020 10:00:00, 2, 11
1/5/2020 10:10:00, 2, 14
1/5/2020 10:20:00, 2, 16
날짜 형식의 데이터인 date 컬럼이 존재하는데, 이 파일을 read_csv로 읽은 후 데이터형을 확인하면 다음과 같다.
코드)
import numpy as np
import pandas as pd
f_name = 'sample.csv'
df = pd.read_csv(f_name)
print(df.info())
datetime 형이 아니라 object 형 데이터로 추론해 읽어 들이는데, 이 글에서는 read_csv 함수로 날짜/시간 데이터를 datetime 형으로 읽는 방법을 정리한다.
1. parse_dates
Pandas.read_csv 함수 사용 시 parse_dates 매개변수로 날짜/시간 데이터로 읽을 컬럼을 지정한다.
parse_dates를 사용할 때 infer_datetime_format 매개변수를 True로 지정하면, 날짜 데이터의 문자열 형식 유추를 시도하고 유추가 가능하면 보다 빠른 파싱 방법을 사용한다.
df = pd.read_csv(f_name, parse_dates=['date'], infer_datetime_format=True)
print(df.info())
2. Day first 형식 데이터 파싱
Pandas.read_csv 함수 사용 시 parse_dates 매개변수와 dayfirst 매개변수를 사용하면 날짜가 먼저 표시되는 데이터(DD/MM, DD MM, DD-MM)를 파싱할 수 있다. 기본값은 False이다.
코드 )
df = pd.read_csv(f_name, parse_dates=['date'], dayfirst=True, infer_datetime_format=True)
df['day'] = df['date'].apply(lambda x: x.day)
df['month'] = df['date'].apply(lambda x: x.month)
dayfirst 값에 따른 실행 결과
3. 여러 컬럼을 날짜/시간 데이터로 결합
혹은 날짜/시간 데이터가 여러 열로 분할되어 있을 수 있다. parse_dates 매개변수에 컬럼 목록을 중첩 리스트로 전달하면 하나의 날짜/시간 데이터를 얻을 수 있다.
year,month,day,product,price
2019,1,1,A,10
2019,1,2,B,20
2019,1,3,C,30
2019,1,4,D,40
코드)
f_name = 'sample2.csv'
df = pd.read_csv(f_name, parse_dates=[['year', 'month', 'day']], infer_datetime_format=True)
결합된 컬럼의 이름을 지정할 때는 결합 컬럼의 이름을 키로 하고, 결합할 컬럼 리스트를 값으로 하는 딕셔너리를 전달한다.
df = pd.read_csv(f_name, parse_dates={'date':['year', 'month', 'day']}, infer_datetime_format=True)
4. date_parser
기본적으로 날짜/시간 데이터는 dateutil.parser.parse의 Pandas 내장 파서를 이용해 파싱된다. 다만 내장 파서로 파싱 되지 않은 형식의 데이터인 경우에는 직접 파싱 함수를 작성하여 사용할 수 있다.
timezone이 포함된 데이터인 경우가 해당할 수 있다.
코드)
from io import StringIO
content = """\
date
2000-01-01T00:00:00+05:00
2000-01-01T00:00:00+06:00"""
df = pd.read_csv(StringIO(content),
parse_dates=["date"],
date_parser=lambda col: pd.to_datetime(col, utc=True))
참고 문서
https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
https://pandas.pydata.org/docs/user_guide/io.html#io-csv-mixed-timezones