2017-12-16 20 views
0

날짜가있는 CSV 파일 가져 오기와 관련하여 오늘 오류가 발생했습니다. 파일에 알려진 품질 문제가 있으며이 경우 한 항목은 데이터 입력 오류로 인해 "3/30/3013"입니다.Python 3 OutOfBoundsDatetime : 범위를 벗어남 시간 초과 : (해결 방법)

OutOfBoundsDatetime 오류에 대한 다른 항목을 읽으면 datetime의 상한이 4/11/2262로 끝납니다. 제안 된 해결책은 날짜 형식을 수정하는 것이 었습니다. 제 경우에는 날짜 형식이 맞지만 데이터가 잘못되었습니다.

NumPy와 논리를 적용 :

df['Contract_Signed_Date'] = np.where(df['Contract_Signed_Date']>'12/16/2017', 
    df['Alt_Date'],df['Contract_Signed_Date']) 

파일의 '계약 체결 날짜가'오늘보다 큰 본질적 경우, 내가 대신 Alt_Date 열을 사용하려면 (2017년 12월 16일 인). 3013 항목에 오류가있는 경우를 제외하고 작동하는 것 같습니다. 경계 밖의 오류를 피할 수없는 좋은 방법이 있습니까?

+0

Contract_Signed_Date이 문자열로 dataframe에서 사용할 수 있습니까? –

+0

빌, 그래, 할 수있어 : df [ 'Contract_Signed_Date']. astype (str)하지만 df.Contract_Signed_Date.dt.strftime ('% Y/% m/% d') 오류가 발생합니다. ".dt 만 사용할 수 있습니다. 접근자를 datetimelike 값으로. " date_time을 사용하면 범위를 벗어나게됩니다. –

답변

0

아마도 희미하게 un 파이톤이지만 원하는대로하는 것처럼 보입니다.

입력, 파일 arthur.csv :

input_date,var1,var2 
3/30/3013,2,34 
02/2/2017,17,35 

코드 :

import pandas as pd 
from io import StringIO 

target_date='2017-12-17' 
for_pandas = StringIO() 
print ('input_date,var1,var2,alt_date', file=for_pandas) #new header 
with open('arthur.csv') as arthur: 
    next(arthur) #skip header in csv 
    for line in arthur: 
     line_items = line.rstrip().split(',') 
     date = '{:4s}-{:0>2s}-{:0>2s}'.format(*list(reversed(line_items[0].split('/')))) 
     if date>target_date: 
      output = '{},{},{},{}'.format(*['NaT',line_items[1],line_items[2],date]) 
     else: 
      output = '{},{},{},{}'.format(*[date,line_items[1],line_items[2],'NaT']) 
     print(output, file=for_pandas) 
for_pandas.seek(0) 

df = pd.read_csv(for_pandas, parse_dates=['input_date', 'alt_date']) 
print (df) 

출력 :

0  NaT  2 34 3013-30-03 
1 2017-02-02 17 35   NaT