2017-12-16 17 views
0

日付のあるCSVファイルのインポートに今日エラーが発生しました。このファイルには既知の品質問題があり、この場合、データ入力エラーのために1つのエントリが「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を文字列としてデータフレームで利用可能ですか! –

+0

ビル、はいできます:df ['Contract_Signed_Date']。astype(str)だが df.Contract_Signed_Date.dt.strftime( '%Y /%m /%d')はエラーが発生する "アクセサーとdatetimikeの値。 date_timeを使用すると、範囲外に戻ってきます。 –

答えて

0

おそらく隠されたun pythonicしかし、あなたが望むように見える。

入力、ファイル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 
関連する問題