pandas read_csv의 datetime dtypes


126

여러 datetime 열이있는 csv 파일을 읽고 있습니다. 파일을 읽을 때 데이터 유형을 설정해야하지만 날짜 시간이 문제인 것 같습니다. 예를 들면 :

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = ['datetime', 'datetime', 'str', 'float']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

실행하면 오류가 발생합니다.

TypeError : "datetime"데이터 유형을 이해할 수 없습니다.

사실 후에 pandas.to_datetime ()을 통해 열을 변환하는 것은 어떤 열이 datetime 객체가 될지 알 수없는 옵션이 아닙니다. 그 정보는 변경 될 수 있으며 내 dtypes 목록에 알려주는 모든 정보에서 비롯됩니다.

또는 numpy.genfromtxt로 csv 파일을로드하고 해당 함수에서 dtypes를 설정 한 다음 pandas.dataframe으로 변환하려고 시도했지만 데이터가 왜곡됩니다. 어떤 도움이라도 대단히 감사합니다!

답변:


272

작동하지 않는 이유

csv 파일은 문자열, 정수 및 부동 소수점 만 포함 할 수 있으므로 read_csv에 대해 설정할 datetime dtype이 없습니다.

dtype을 datetime으로 설정하면 pandas가 datetime을 객체로 해석하여 문자열로 끝납니다.

이것을 해결하는 팬더 방법

pandas.read_csv()함수에는 다음과 같은 키워드 인수가 있습니다.parse_dates

이것을 사용하면 기본값 date_parser( dateutil.parser.parser)을 사용하여 문자열, 부동 소수점 또는 정수를 datetimes로 즉시 변환 할 수 있습니다.

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = {'col1': 'str', 'col2': 'str', 'col3': 'str', 'col4': 'float'}
parse_dates = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes, parse_dates=parse_dates)

이 팬더 읽고 발생할 수 col1col2그들이 가능성이 가장 높은 문자열로 ( "2016년 5월 5일"등) 및 문자열을 읽은 후, 각 열의 date_parser는 해당 문자열에 따라 행동하고 무엇이든 그 함수가 반환을 다시 줄 것이다 .

자신의 날짜 구문 분석 기능 정의 :

pandas.read_csv()함수 에는 다음과 같은 키워드 인수 있습니다.date_parser

이것을 람다 함수로 설정하면 해당 특정 함수가 날짜 구문 분석에 사용됩니다.

GOTCHA 경고

당신은 그것을 함수, 함수의없는 실행을주고있다, 따라서이는 올바른

date_parser = pd.datetools.to_datetime

이것은 올바르지 않습니다 .

date_parser = pd.datetools.to_datetime()

Pandas 0.22 업데이트

pd.datetools.to_datetime 이전되었습니다 date_parser = pd.to_datetime

감사합니다 @stackoverYC


1
@Drake 저는 user3221055가 실제로 사이트에 돌아 오지 않았다고 생각합니다. 그게 문제입니다. 프로필에 "
2014 년

2
이것은 느린 해결책입니다. 이 대신 참조 stackoverflow.com/questions/29882573/...
user1761806

@ user1761806 안녕하세요 좋은 찾기! 그래도 더 나은 것을 만들었습니다. stackoverflow.com/a/46183514/3730397
firelynx

2
pandas 0.22.0에서는 pandas.core.datetools.to_datetime더 이상 사용되지 않는다고 말하고 pd.datetools.to_datetime대신 사용하십시오. 이 같은 :date_parser = pd.to_datetime
stackoverYC

1
converters어떤 열에 어떤 변환기가 있는지 지정할 수 있는 매개 변수 도 있습니다. parse_dates는 유용하고 잘못된 데이터를 처리하지만 각 값을 테스트하고 추론하기 때문에 속도가 느립니다. gist.github.com/gjreda/7433f5f70299610d9b6b
Davos

31

날짜 또는 날짜 / 시간으로 처리하려는 열의 이름을 정의 할 수 있는 parse_dates매개 변수 read_csv가 있습니다.

date_cols = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=date_cols)

열의 단일 문자열 이름을 전달하면서 오류가 발생했습니다. 이제 단일 값에 대한 목록도 전달해야한다는 것을 이해합니다.
TapanHP

15

문자열 대신 실제 유형을 전달할 수 있습니다.

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

하지만 여러분의 데이터 없이는 이것을 진단하기가 정말 어려울 것입니다.

실제로 팬더가 날짜를 TimeStamps로 구문 분석하기를 원할 것입니다.

pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)

7

dtypes = [datetime, ...] 옵션을 사용해 보았지만

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

다음 오류가 발생했습니다.

TypeError: data type not understood

내가 변경해야 할 유일한 변경 사항은 datetime을 datetime.datetime으로 바꾸는 것입니다.

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime.datetime, datetime.datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

3
이것은 여전히 ​​결과 데이터 프레임의 dtype을 pandas.datetime이 아닌 객체로 만들 것입니다
firelynx

11
이것이 원하는 효과가 없다는 사실 외에도 작동하지 않습니다.AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
Gabriel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.