使用eval()

时间:2017-03-30 08:25:19

标签: python-2.7 numpy

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

column1 = np.array([date1, date2,.......,dateN])
column2 = np.array([date1, date2,.......,dateN])

以上两种类型的日期/时间变量。然后我有以下变量运算符,它具有相同的column1和column2长度:

operator = np.array(['>=','<=','==','=!',......])

我得到了#34;无效的令牌&#34;通过以下操作:

np.array([eval('{}{}{}'.format(v1,op,v2)) for v1,op,v2 in zip(column1,operator,column2)])

有任何提示可以解决这个问题吗?

------------------- EDIT ----------------------

对于一些样本数据且没有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')

一旦我引入eval(),我会收到以下错误:

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

---------------------- EDIT&amp;更正----------------------------

我之前提到的日期/时间变量基本上是numpy datetime64类型,我现在在尝试与eval进行两次日期比较时遇到以下问题:

np.array([(repr(d1)+op+repr(d2)) for d1,op,d2 in zip(${Column Name1},${Operator},${Column Name2})])

上面的代码片段是在一个有三列的表上尝试的,其中$ {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评估上面的表达式,如下所示:

np.array([eval(repr(d1)+op+repr(d2)) for d1,op,d2 in zip(${Column Name1},${Operator},${Column Name2})])

最终我收到以下错误:

NameError:name 'numpy' is not defined

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

2 个答案:

答案 0 :(得分:0)

您可能希望使用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]

答案 1 :(得分:0)

可以比较

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

Numpy自己的日期时间对象版本也可以进行比较

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]

使用日期时间对象的repr字符串版本:

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

不是我推荐那种结构。我喜欢字典映射到operator更好。