1

我正在使用 Blaze (0.6.3) 和 Anaconda 2.1.0(在 Python 2.7.8 上)。我正在尝试使用基于表行日期的过滤器。

模拟 TSV 文件如下:

name    amount  date
foo 100 2001-05-11 08:54:48.063856
bar 1000    0001-01-01 00:00:00.0
baz 10000   1970-01-02 00:00:00.0

蟒蛇代码是

from blaze import *
from datetime import datetime
data = Table(CSV('mock.tsv'))

data[data.name > 'bar']
data[data.amount > 1000]
data[data.date > datetime(1970,1,1)]

前两个过滤器没问题,但第三个会抛出SyntaxError.

这一切似乎归结为以下几点:

lambda (name, amount, date): date > (1970-01-01 00:00:00)

这在语法上是无效的。不知何故,某处,datetime(1970,1,1)被翻译成datetime(1970-01-01 00:00:00),然后datetime被遗忘了。Blaze 本身可以识别date带有?datetime类型的列,这正是我想要的,但是在比较中它失败了。

我是否以错误的方式使用它?

4

2 回答 2

1

这是一个较旧的错误,已被修复。在这里它正在使用开发版本。我相信 Anaconda (0.6.5) 上的最新稳定版本也应该可以正常工作

In [1]: !cat tmp/myfile.csv
name, amount, date
foo, 100, 2001-05-11 08:54:48.063856
bar, 1000, 0001-01-01 00:00:00.0
baz, 10000, 1970-01-02 00:00:00.0

In [2]: from blaze import *

In [3]: data = Table('tmp/myfile.csv')

In [4]: from datetime import datetime

In [5]: data[data.date > datetime(1970,1,1)]
Out[5]: 
  name  amount                       date
0  foo     100 2001-05-11 08:54:48.063856
1  baz   10000        1970-01-02 00:00:00

以下应该可以解决您的问题

conda update blaze

此外,Blaze 很乐意将您的字符串强制转换为适当的类型,以防万一您懒得自己创建日期时间

In [6]: data[data.date > '1970-01-01']
Out[6]: 
  name  amount                       date
0  foo     100 2001-05-11 08:54:48.063856
1  baz   10000        1970-01-02 00:00:00
于 2014-11-11T04:04:07.687 回答
0

您可以只使用pandas.to_datetime比较两个日期时间字符串,如下所示:

import pandas as pd

data = pd.read_clipboard()

data
  name  amount                        date
0  foo     100  2001-05-11 08:54:48.063856
1  bar    1000                  1968-01-01
2  baz   10000       1970-01-02 00:00:00.0

问题在于无效的Year值,0001-01-01 00:00:00.0因为它转换为 pandas 为2001-01-01 ...

pd.to_datetime(data['date'][1])
Timestamp('2001-01-01 00:00:00')

通过更改无效日期值,

# for example as 1968-01-01
data['date'][1] = '1968-01-01'

它成功返回您想要的结果

data[pd.to_datetime(data.date) > pd.to_datetime('1970-01-01')]
  name  amount                        date
0  foo     100  2001-05-11 08:54:48.063856
2  baz   10000       1970-01-02 00:00:00.0
于 2014-11-10T14:57:17.780 回答