1 问题说明
在进行文献下载完毕后,使用metaknowledge读入文献时候是正常的,但是要通过RC.makeDict()
方法转化为字典结构,却发生了PD报错问题(KeyError: 'PD'
),如下
2 问题探索
顺着报错的提示,后面提示出现了其它的异常,如下。显示最终是helpFuns.py
文件汇总的月份解析函数无法解析文献中的字段信息。
因此可以打开源文件进行调试。第一步,找到metaknowledge安装包在本地计算机的位置,输入代码mk.__path__
,执行结果如下(也可以按照上面的的报错提示文件路径找到)
然后再上述路径指示,找到helpFuns.py
文件并打开。在getMonth()
函数的首行添加print(s)
代码,查看要解析的数据。
第二步,修改保存代码后重新运行转化字典结构的代码。再次运行转化的代码,如下。结果输出中发现程序是可以正常解析部分月份,但是当文献字段中存在年份的时候,解析失败,从而出现报错。
第三步,找出程序无法进行解析的数据信息。进一步找到前一个文件中调用getMonth()
函数的程序位置,即tagFunction.py
文件中的Month()
函数中(依据前面的报错信息),然后再插入调试代码print(val)
,注释掉调用getMonth()
函数的代码,如下
第四步,保存修改的代码文件后重新运行字典格式转化的代码。执行完成后,输出结果如下。可以发现程序是没有办法对“年 月 日”的格式进行解析。(由于metaknowledge每次读入的数据都是乱序的,因此此处的输出结果顺序和上一次的输出不一致)
3 问题解决
找到了程序无法解析的字段信息后,只需要针对于无法解析的格式单独处理,即可。首先在tagFunction.py
文件中修改传入的参数,修改为val[0])
,并注释掉调试代码,如下
然后回到getMonth()
函数中针对于“年 月 日”格式进行处理。首先在jupyter上面针对不同的核实进行测试,如下
monthDict = {'SPR': 3, 'SUM': 6, 'FAL': 9, 'WIN': 12, 'JAN' : 1, 'FEB' : 2, 'MAR' : 3, 'APR' : 4, 'MAY' : 5, 'JUN' : 6 , 'JUL' : 7, 'AUG' : 8, 'SEP' : 9, 'OCT' : 10, 'NOV' : 11, 'DEC' : 12}
# s = '2022 JUN 23'
# s = 'MAR-APR'
# s = 'MAR 1'
s = 'MAR'
if s.split()[0].isdigit():
print(monthDict[s.split()[1]])
elif '-' in s:
print(monthDict[s.split('-')[0]])
elif ' ' in s:
print(monthDict[s.split()[0]])
else:
print(monthDict[s])
输出结果如下
可以正常解析后,再把代码复制粘贴到getMonth()
函数中,并注释掉原来的代码,如下
保存修改文件后,重新运行字典转化代码,并尝试将数据变成DataFrame结构,输出结果如下。
此时可以正常解析,进一步查看PD
字段的信息,并进行value_counts()
计数,和有效数据计数,如下。
修改源文件代码后可以正常解析数据,并且最终识别的数据量为330条。
4 数据核实
有必要核实原始文献中包含的时间信息,确定是否所有的格式都考虑到,输出文献的全部数据量为330,与成功解析的数据量相同。
进一步更换数据集,测试修改的代码是够具有通用性,换一份文献数据集进行核实。比如加载书中的wos数据集,此时可以正常读取,且检验缺失值中发现PD字段中并未有缺失,说明修改的代码可以通用。
如果后续仍然遇到PD字段报错,可以采用本文的思路,将无法识别的数据信息进行单独处理,然后再把可以处理的代码粘贴到源代码中即可。