Python/NumPy | Pandas

[Python] Pandas - read_csv 날짜 데이터 읽기

비번변경 2023. 4. 1. 23:05

개요

아래와 같은 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

https://towardsdatascience.com/4-tricks-you-should-know-to-parse-date-columns-with-pandas-read-csv-27355bb2ad0e

 

4 tricks you should know to parse date columns with Pandas read_csv()

Some of the most helpful Pandas tricks

towardsdatascience.com