使用eval的小技巧
eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。
也就是说:将字符串当成有效的表达式来求值并返回计算结果。
在处理数学建模2012年C题脑卒中的问题的数据的时候,由于需要处理的数据量较大,涉及到多张表的处理,且多张表的结构类似、处理方式类似,故我在命名上就从小到大依次用 info_ + 数字 来代替
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
xlsx_7 = pd.ExcelFile('../../MetaData/Appendix-C1/data1.xls')
xlsx_8 = pd.ExcelFile('../../MetaData/Appendix-C1/data2.xls')
xlsx_9 = pd.ExcelFile('../../MetaData/Appendix-C1/data3.xls')
xlsx_10 = pd.ExcelFile('../../MetaData/Appendix-C1/data4.xls')
info_7 = pd.read_excel(xlsx_7, '脑卒中')
info_8 = pd.read_excel(xlsx_8, '脑卒中')
info_9 = pd.read_excel(xlsx_9, '脑卒中')
info_10 = pd.read_excel(xlsx_10, '脑卒中')
由于各张表的处理方法是类似的,处理起来的代码也是一样的。所以一开始想到最简单的办法就是把代码多复制几次,然后直接修改前面变量的名称。
for i in range(info_7.index.size):
try:
if type(info_7.at[i,'Time of incidence']) == str:
time_list = info_7.at[i,'Time of incidence'].split('-')
if int(time_list[2]) > int(time_list[0]):
info_7.at[i,'Time of incidence'] = datetime(int(time_list[2]),int(time_list[1]),int(time_list[0])).date()
else:
info_7.at[i,'Time of incidence'] = datetime(int(time_list[0]),int(time_list[1]),int(time_list[2])).date()
if type(info_7.at[i,'Report time']) == str:
time_list = info_7.at[i,'Report time'].split('-')
if int(time_list[2]) > int(time_list[0]):
info_7.at[i,'Report time'] = datetime(int(time_list[2]),int(time_list[1]),int(time_list[0])).date()
else:
info_7.at[i,'Report time'] = datetime(int(time_list[0]),int(time_list[1]),int(time_list[2])).date()
info_7.at[i,'Time of incidence'] = info_7.at[i,'Time of incidence'].date()
info_7.at[i,'Report time'] = info_7.at[i,'Report time'].date()
except:
try:
if info_7.at[i,'Report time'] == '2010-9-':
info_7.at[i,'Time of incidence'] = info_7.at[i,'Time of incidence'].date()
info_7.at[i,'Report time'] = datetime(2010,9,1).date()
if type(info_7.at[i,'Time of incidence']) == str:
info_7.at[i,'Time of incidence'] = datetime.strptime(info_7.at[i,'Time of incidence'],'%d/%m/%Y').date()
if type(info_7.at[i,'Report time']) == str:
info_7.at[i,'Report time'] = datetime.strptime(info_7.at[i,'Report time'],'%d/%m/%Y').date()
except:
print(str(i)+': Time of incidence: '+str(info_7.at[i,'Time of incidence']))
print(str(i)+': Report time: '+str(info_7.at[i,'Report time']))
但是发现这样处理起来还是十分的麻烦的,代码冗余不说,光是改这么多变量也挺累的,改的时候还有可能遗漏,于是我就想能不能就使用一个for循环就把这个操作完成,最容易想到的办法就是才用数组的方式,然后去遍历这个数组,其实我们还有另外一种方式,就是利用eval函数的将字符串当成有效的表达式来求值并返回计算结果的特性,利用一个for循环,并采用字符串拼接的形式实现
eval('info_'+str(j)) # j=1,2,3,...
for j in range(7,11):
for i in range(eval('info_'+str(j)).index.size):
try:
if type(eval('info_'+str(j)).at[i,'Time of incidence']) == str:
time_list = eval('info_'+str(j)).at[i,'Time of incidence'].split('-')
if int(time_list[2]) > int(time_list[0]):
eval('info_'+str(j)).at[i,'Time of incidence'] = datetime(int(time_list[2]),int(time_list[1]),int(time_list[0])).date()
else:
eval('info_'+str(j)).at[i,'Time of incidence'] = datetime(int(time_list[0]),int(time_list[1]),int(time_list[2])).date()
if type(eval('info_'+str(j)).at[i,'Report time']) == str:
time_list = eval('info_'+str(j)).at[i,'Report time'].split('-')
if int(time_list[2]) > int(time_list[0]):
eval('info_'+str(j)).at[i,'Report time'] = datetime(int(time_list[2]),int(time_list[1]),int(time_list[0])).date()
else:
eval('info_'+str(j)).at[i,'Report time'] = datetime(int(time_list[0]),int(time_list[1]),int(time_list[2])).date()
eval('info_'+str(j)).at[i,'Time of incidence'] = eval('info_'+str(j)).at[i,'Time of incidence'].date()
eval('info_'+str(j)).at[i,'Report time'] = eval('info_'+str(j)).at[i,'Report time'].date()
except:
try:
if eval('info_'+str(j)).at[i,'Report time'] == '2010-9-':
eval('info_'+str(j)).at[i,'Time of incidence'] = eval('info_'+str(j)).at[i,'Time of incidence'].date()
eval('info_'+str(j)).at[i,'Report time'] = datetime(2010,9,1).date()
if type(eval('info_'+str(j)).at[i,'Time of incidence']) == str:
eval('info_'+str(j)).at[i,'Time of incidence'] = datetime.strptime(eval('info_'+str(j)).at[i,'Time of incidence'],'%d/%m/%Y').date()
if type(eval('info_'+str(j)).at[i,'Report time']) == str:
eval('info_'+str(j)).at[i,'Report time'] = datetime.strptime(eval('info_'+str(j)).at[i,'Report time'],'%d/%m/%Y').date()
except:
print(str(i)+': Time of incidence: '+str(eval('info_'+str(j)).at[i,'Time of incidence']))
print(str(i)+': Report time: '+str(eval('info_'+str(j)).at[i,'Report time']))