Python Pandas read_csv:使用单个变量加载多个文件-日期转换函数未绑定错误
问题: 为什么日期转换函数对空值抛出错误? 如何强制将对象转换为datetime值,以便随后插入到数据库表中 下面有点冗长。很抱歉,我试图只捕获基本部分,因为到目前为止,我还没有找到任何关于这种编码组合的有效答案 背景 使用变量(包括列表和dict),我的导入函数可以始终相同地处理不同的文件导入。 导入的代码段如下所示:Python Pandas read_csv:使用单个变量加载多个文件-日期转换函数未绑定错误,python,pandas,Python,Pandas,问题: 为什么日期转换函数对空值抛出错误? 如何强制将对象转换为datetime值,以便随后插入到数据库表中 下面有点冗长。很抱歉,我试图只捕获基本部分,因为到目前为止,我还没有找到任何关于这种编码组合的有效答案 背景 使用变量(包括列表和dict),我的导入函数可以始终相同地处理不同的文件导入。 导入的代码段如下所示: for dataset in pd.read_csv( file_in, chunksize = 50000, sep = col_sep, encoding = en
for dataset in pd.read_csv( file_in, chunksize = 50000, sep = col_sep, encoding = encoded, header = row_head,
names = col_names, usecols = col_names, parse_dates = col_dates, converters = col_cv_map):
...
变量的一个示例如下:
col_names = [ 'code_purchase_order', 'code_container', 'type_container', 'name_vessel', 'code_carrier_bill', 'date_planned_receipt',
'date_estimate_depart', 'date_estimate_arrival', 'date_nolo_container', 'name_nolo_comment', 'date_pan_diff_eta',
'date_kn_diff_eta', 'name_port_load', 'date_adod', 'code_warehouse', 'name_ship_to', 'name_carrier',
'flag_hannover_warehouse', 'flag_extra_work_plan'
]
col_dates = [ 'date_planned_receipt', 'date_estimate_depart', 'date_estimate_arrival', 'date_nolo_container',
'date_pan_diff_eta', 'date_kn_diff_eta', 'date_adod'
]
col_cv_map = { 'type_container':cv_quote, 'date_planned_receipt':cv_forcedate, 'date_estimate_depart':cv_forcedate,
'date_estimate_arrival':cv_forcedate, 'date_nolo_container':cv_forcedate, 'date_pan_diff_eta':cv_forcedate,
'date_kn_diff_eta':cv_forcedate, 'date_adod':cv_forcedate
}
col_sep = ';'
然后使用pandas to_sql方法将数据帧写入数据库表。
除非列中不存在日期值,否则这种方法很有效。在这些情况下,我从日期解析中得到一个对象,而不是一个日期
数字转换功能工作正常,强制对象日期的功能会导致错误:
UnboundLocalError: local variable 'out_dt' referenced before assignment
我可以看到函数进入except分支,因为它输出:
转换为日期时出错:
这意味着空值不能转换为日期结果
编码
为了进行比较,cv_number函数工作正常,cv_forcedate抛出异常
def cv_number(in_obj):
"""Convert incoming string into number"""
try:
out_num = float( in_obj.replace(',', '.') )
except ValueError:
out_num = ny.nan
except:
print(f'Error converting to number: <{in_obj}> ')
return out_num
def cv_forcedate(in_obj):
"""Forces object to datetime"""
try:
# try first format yyyy/mm/dd
dt_fmt = '%Y/%m/%d'
out_dt = in_obj.apply(lambda _: datetime.strptime(_, dt_fmt)) #datetime.strptime(in_obj, dt_fmt)
except ValueError:
out_dt = ny.nat
except:
print(f'Error converting to date: <{in_obj}>')
return out_dt
def cv_编号(在obj中):
“”“将传入字符串转换为数字”“”
尝试:
out_num=float(in_obj.replace(',','。))
除值错误外:
out_num=ny.nan
除:
打印(f'转换为数字时出错:')
返回数值
def cv_强制日期(在obj中):
“”“将对象强制为日期时间”“”
尝试:
#尝试第一种格式yyyy/mm/dd
dt_fmt='%Y/%m/%d'
out_dt=in_obj.apply(lambda:datetime.strtime(u,dt_fmt))#datetime.strtime(in_obj,dt_fmt)
除值错误外:
out_dt=ny.nat
除:
打印(f'转换为日期时出错:')
返回
当我比较执行时,两者的工作方式似乎相同:
import dis
dis.dis(cv_number)
108 0 SETUP_EXCEPT 20 (to 22)
109 2 LOAD_GLOBAL 0 (float)
4 LOAD_FAST 0 (in_obj)
6 LOAD_ATTR 1 (replace)
8 LOAD_CONST 1 (',')
10 LOAD_CONST 2 ('.')
12 CALL_FUNCTION 2
14 CALL_FUNCTION 1
16 STORE_FAST 1 (out_num)
18 POP_BLOCK
20 JUMP_FORWARD 52 (to 74)
110 >> 22 DUP_TOP
24 LOAD_GLOBAL 2 (ValueError)
26 COMPARE_OP 10 (exception match)
28 POP_JUMP_IF_FALSE 46
30 POP_TOP
32 POP_TOP
34 POP_TOP
111 36 LOAD_GLOBAL 3 (ny)
38 LOAD_ATTR 4 (nan)
40 STORE_FAST 1 (out_num)
42 POP_EXCEPT
44 JUMP_FORWARD 28 (to 74)
112 >> 46 POP_TOP
48 POP_TOP
50 POP_TOP
113 52 LOAD_GLOBAL 5 (print)
54 LOAD_CONST 3 ('Error converting to number: <')
56 LOAD_FAST 0 (in_obj)
58 FORMAT_VALUE 0
60 LOAD_CONST 4 ('> ')
62 BUILD_STRING 3
64 CALL_FUNCTION 1
66 POP_TOP
68 POP_EXCEPT
70 JUMP_FORWARD 2 (to 74)
72 END_FINALLY
114 >> 74 LOAD_FAST 1 (out_num)
76 RETURN_VALUE
import dis
dis.dis(cv_forcedate)
118 0 SETUP_EXCEPT 26 (to 28)
120 2 LOAD_CONST 1 ('%Y/%m/%d')
4 STORE_DEREF 0 (dt_fmt)
121 6 LOAD_FAST 0 (in_obj)
8 LOAD_ATTR 0 (apply)
10 LOAD_CLOSURE 0 (dt_fmt)
12 BUILD_TUPLE 1
14 LOAD_CONST 2 (<code object <lambda> at 0x7f8b2d4878a0, file "<ipython-input-16-91bdd92a24b3>", line 121>)
16 LOAD_CONST 3 ('cv_forcedate.<locals>.<lambda>')
18 MAKE_FUNCTION 8
20 CALL_FUNCTION 1
22 STORE_FAST 1 (out_dt)
24 POP_BLOCK
26 JUMP_FORWARD 52 (to 80)
122 >> 28 DUP_TOP
30 LOAD_GLOBAL 1 (ValueError)
32 COMPARE_OP 10 (exception match)
34 POP_JUMP_IF_FALSE 52
36 POP_TOP
38 POP_TOP
40 POP_TOP
123 42 LOAD_GLOBAL 2 (ny)
44 LOAD_ATTR 3 (nat)
46 STORE_FAST 1 (out_dt)
48 POP_EXCEPT
50 JUMP_FORWARD 28 (to 80)
124 >> 52 POP_TOP
54 POP_TOP
56 POP_TOP
125 58 LOAD_GLOBAL 4 (print)
60 LOAD_CONST 4 ('Error converting to date: <')
62 LOAD_FAST 0 (in_obj)
64 FORMAT_VALUE 0
66 LOAD_CONST 5 ('>')
68 BUILD_STRING 3
70 CALL_FUNCTION 1
72 POP_TOP
74 POP_EXCEPT
76 JUMP_FORWARD 2 (to 80)
78 END_FINALLY
126 >> 80 LOAD_FAST 1 (out_dt)
82 RETURN_VALUE
导入dis
dis.dis(cv_编号)
108 0除20(至22)外的其他设置
109 2负载_全局0(浮动)
4加载速度0(在obj中)
6装载属性1(更换)
8荷载常数1(',')
10荷载常数2(‘.)
12调用函数2
14调用函数1
16存储快速1(输出数量)
18波普卢大厦
20向前跳52(到74)
110>>22重复顶部
24负载_全局2(值错误)
26比较操作10(例外匹配)
28如果为假,则弹出跳转46
30件流行上衣
32件流行上衣
34件流行上衣
111 36负载_全球3(纽约)
38装载属性4(nan)
40存储快速1(输出数量)
42 POP_除外
44向前跳28(到74)
112>>46件流行上衣
48件流行上衣
50件流行上衣
113 52加载_全局5(打印)
54加载常数3('转换为数字时出错:')
62构建字符串3
64调用函数1
66流行上衣
68波普
70向前跳2(至74)
终于结束了
114>>74加载速度1(输出数量)
76返回值
进口dis
dis.dis(cv_生效日期)
118 0设置,26(至28)除外
120 2加载常数1(“%Y/%m/%d”)
4存储数据0(dt\u fmt)
121 6加载速度0(in_obj)
8加载属性0(应用)
10负载关闭0(dt\U fmt)
12构建元组1
14加载常数2(<0x7f8b2d4878a0处的代码对象lambda,文件“ipython-input-16-91bdd92a24b3”,第121行>)
16荷载常数3('cv\U力日期…)
18制作功能8
20调用函数1
22门店快速1(外出)
24波普卢街区
26向前跳52(到80)
122>>28双陀螺
30加载_全局1(值错误)
32比较操作10(异常匹配)
34如果为假,则弹出跳转52
36件流行上衣
38件流行上衣
40件流行上衣
123 42负载_全球2(纽约)
44装载属性3(nat)
46商店快速1(外出)
48波普
50向前跳28(到80)
124>>52件流行上衣
54件流行上衣
56件流行上衣
125 58 LOAD_GLOBAL 4(打印)
60加载常数4('转换为日期时出错:')
68构建字符串3
70呼叫功能1
72件流行上衣
74流行音乐除外
76向前跳2(至80)
终于结束了
126>>80加载快速1(输出)
82返回值
特别是,如果可能的话,我会尝试确定我做错了什么,因为我发现所有的演示和示例编码都使用了格式良好的测试用例,这些用例与我正在处理的实际数据不匹配