Python 3 OutOfBoundsDatetime:超出界限纳秒时间戳:(解决方法)

时间:2017-12-16 16:02:52

标签: python-3.x numpy datetime indexoutofboundsexception

今天遇到一个错误,涉及导入带有日期的CSV文件。该文件存在已知质量问题,在这种情况下,由于数据输入错误,一个条目为“3/30/3013”。

阅读有关OutOfBoundsDatetime错误的其他条目,日期时间的上限最大值为4/11/2262。建议的解决方案是修复日期的格式。在我的情况下,日期格式是正确的,但数据是错误的。

应用numpy逻辑:

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

基本上,如果文件的'Contract Signed Date'大于今天(12/16/2017),我想改用Alt_Date列。它似乎工作,除非它在3013年进入它错误输出。什么是围绕越界错误的好的pythonic方式?

1 个答案:

答案 0 :(得分: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