python标准库函数eval的使用小技巧

使用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']))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值