Python Pandas read_csv:使用单个变量加载多个文件-日期转换函数未绑定错误

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

问题:

为什么日期转换函数对空值抛出错误? 如何强制将对象转换为datetime值,以便随后插入到数据库表中

下面有点冗长。很抱歉,我试图只捕获基本部分,因为到目前为止,我还没有找到任何关于这种编码组合的有效答案

背景

使用变量(包括列表和dict),我的导入函数可以始终相同地处理不同的文件导入。 导入的代码段如下所示:

    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返回值
特别是,如果可能的话,我会尝试确定我做错了什么,因为我发现所有的演示和示例编码都使用了格式良好的测试用例,这些用例与我正在处理的实际数据不匹配