2017-10-03 3 views
1

15 개의 열과 100,000 개 이상의 행이있는 csv 파일을 데이터 프레임으로 가져 왔습니다. 기둥 중 하나는 출생 연도를 나타내는 '출생'입니다. 'birth'열에는 실제로 '02 -Aug-34 '형식의 날짜 목록,'29DEC1899 '형식의 목록 및 마지막으로 빈 문자열 형식' '형식의 3 가지 문자열 형식이 있습니다.데이터 프레임에있는 항목 집합의 데이터 유형 변경

나는 '출생'문자열 유형을 정렬하고 비어 있지 않은 스크립트를 주어진 날짜의 datetime 형식으로 변환 할 수있는 스크립트를 작성했습니다. 행 번호가있는 적절한 목록을 반복하는 루프를 사용하여 문자열에서 datetime으로 데이터 프레임 'birth'항목을 대체합니다. 기본적으로 이전 값을 재정의합니다.

100,000 개 이상의 항목을 보려면 약 130 초가 소요됩니다. 입력 값의 3 가지 가능한 경우에 따라 데이터 유형을 변환하는보다 효율적인 방법이 있습니까? 완료 시간 (130 초)이 적당합니까?

저는 팬더를 사용하는 데있어 매우 새로운 기술입니다.

+0

'02-Aug-15'는 때때로 '2015'이고 때로는'1915'가 가능합니까? – jezrael

+0

@ jezrael 아니요, 날짜는 모두 2000 년 이전입니다. – Francesco

답변

0

당신이 할 수있는 위해, "형식 = '% D- % M- % Y'"로 날짜 형식을 지정할 수 있습니다 각 형식에 대해 to_datetime을 두 번 사용하고 combine_first :

02-Aug-15도 가끔 02-Aug-1815 o 일 수 없습니다. r 02-Aug-1915 또는 02-Aug-2015으로 구분할 수 없으므로

df = pd.DataFrame({'date':['02-Aug-34','29DEC1899','02-Aug-15','']}) 

#format 29DEC1899 
d1 = pd.to_datetime(df['date'], format='%d%b%Y', errors='coerce') 

#replace last - to 19 
dates = df['date'].str.replace(r'(.*)-', r'\1-19') 
#alternative1 
#dates = df['date'].str[::-1].str.replace('-', '91-', n=1).str[::-1] 
#alternative2 
#dates = df['date'].str.rsplit('-', n=1).str.join('-19') 

#format 02-Aug-34 
d2 = pd.to_datetime(dates, format='%d-%b-%Y', errors='coerce') 

#combine formats 
d = d1.combine_first(d2) 
print (d) 
0 1934-08-02 
1 1899-12-29 
2 1915-08-02 
3   NaT 
Name: date, dtype: datetime64[ns] 
관련 문제