今天遇到一个错误,涉及导入带有日期的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方式?
答案 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