Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 使用eval()评估混合类型_Python 2.7_Numpy - Fatal编程技术网

Python 2.7 使用eval()评估混合类型

Python 2.7 使用eval()评估混合类型,python-2.7,numpy,Python 2.7,Numpy,我有两个日期/时间变量,其中包含日期/时间值列表,另一个变量包含操作日期/时间变量的运算符列表。格式可表示如下: column1 = np.array([date1, date2,.......,dateN]) column2 = np.array([date1, date2,.......,dateN]) np.array([eval(repr(d1)+op+repr(d2)) for d1,op,d2 in zip(${Column Name1},${Operator},${Column

我有两个日期/时间变量,其中包含日期/时间值列表,另一个变量包含操作日期/时间变量的运算符列表。格式可表示如下:

column1 = np.array([date1, date2,.......,dateN])
column2 = np.array([date1, date2,.......,dateN])
np.array([eval(repr(d1)+op+repr(d2)) for d1,op,d2 in zip(${Column Name1},${Operator},${Column Name2})])
上述两个日期/时间类型的变量。然后我有一个变量操作符,它的column1和column2长度相同:

operator = np.array(['>=','<=','==','=!',......])
有什么可以回避这个问题的暗示吗

-------------------编辑----------------------

使用一些示例数据,不使用eval,我得到以下输出:

 np.array(['{} {} {}'.format(v1,op,v2) for v1,op,v2 in zip(datelist1,operator,datelist2)])


array(['2017-03-30 10:30:22.928000 <= 2012-05-23 00:00:00',
   '2011-01-07 00:00:00 == 2017-03-30 10:31:14.477000'], 
  dtype='|S49')
上面的代码段在一个包含三列的表上进行了尝试,其中${Column Name1}和${Column Name2}为numpy.datetime64类型,${Operator}为字符串类型。其中一行的结果如下所示:

numpy.datetime64('2014-08-13T02:00:00.000000+0200')>=numpy.datetime64('2014-08-13T02:00:00.000000+0200')
现在我想用函数eval对上述表达式求值,如下所示:

column1 = np.array([date1, date2,.......,dateN])
column2 = np.array([date1, date2,.......,dateN])
np.array([eval(repr(d1)+op+repr(d2)) for d1,op,d2 in zip(${Column Name1},${Operator},${Column Name2})])
最终我得到了以下错误:

eval('2011-01-07 00:00:00 == 2017-03-30 10:31:14.477000')
File "<string>", line 1
2011-01-07 00:00:00 == 2017-03-30 10:31:14.477000
            ^
SyntaxError: invalid syntax
NameError:name 'numpy' is not defined

我可以假设这个问题。我使用的开源工具是将numpy作为np导入,而repr()返回它无法识别的numpy。如果这是问题所在,如何解决此问题?

您可能希望使用python运算符来解决此问题:

# import operators used
import operator
from operator import ge, eq, le, ne

# build a look up table from string to operators
ops = {">=": ge, "==": eq, "<=": le, "!=": ne}

import numpy as np

# used some numbers to simplify the case, should work on datetime as well
a = np.array([1, 3, 5, 3])
b = np.array([2, 3, 2, 1])
operator = np.array(['>=','<=','==','!='])

# evaluate the operation
[ops[op](x, y) for op, x, y in zip(operator, a, b)]
# [False, True, False, True]
#使用导入运算符
进口经营者
从操作员输入ge、eq、le、ne
#构建从字符串到运算符的查找表

ops={“>=”:ge,“==”:eq,“
datetime
可以比较对象:

In [506]: datetime.datetime.today()
Out[506]: datetime.datetime(2017, 3, 30, 10, 43, 18, 363747)
In [507]: t1=datetime.datetime.today()
In [508]: t2=datetime.datetime.today()
In [509]: t1 < t2
Out[509]: True
In [510]: t1 == t2
Out[510]: False

我不推荐这种构造。我更喜欢映射到
操作符的字典。

不使用eval显示部分字符串。我不理解-“显示部分字符串”"。请提供更详细的评论。请尽量帮助回答您的问题。不要指望我们猜给
eval
的字符串是什么样子。'2011-01-07 00:00:00==2017-03-30 10:31:14.477000'不是有效的python表达式。那么如何使用比较运算符比较python中的日期类型?正如我在第一篇文章中提到的,我是ge将运算符设置为字符串列表:operator=np.array(['=','!='])。如何使用datetime24和字符串类型的组合生成表达式?I hour eval()将执行此任务,但您正在创建一个字符串表达式,其中包含datetime对象的
str
表示形式。是的,我是,因为我不知道如何计算混合类型的表达式:一个是datetime类型,另一个是string类型。我使用了format()和eval()进行评估。最终没有成功。看起来您发现了
eval(rept)的意外问题(该问题由eval解决(repr(t1)。replace('numpy','np'))
In [516]: nt1 = np.datetime64('2017-03-30 10:30:22.928000')
In [517]: nt2 = np.datetime64('2017-03-30 10:31:14.477000')
In [518]: nt1 < nt2
Out[518]: True
In [519]: nt3 = np.datetime64('2012-05-23 00:00:00')
In [520]: [nt1 <= nt2, nt2==nt3]
Out[520]: [True, False]
In [524]: repr(t1)+'<'+repr(t2)
Out[524]: 'datetime.datetime(2017, 3, 30, 10, 47, 29, 69324)<datetime.datetime(2017, 3, 30, 10, 47, 33, 669494)'
In [525]: eval(repr(t1)+'<'+repr(t2))
Out[525]: True