我正在使用Blaze(0.6.3)和Anaconda 2.1.0(在Python 2.7.8上)。 我正在尝试根据Table的行上的日期使用过滤器。
模拟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
python代码是
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
列,这是我想要的,但后来在比较中失败了。
我是以错误的方式使用它吗?
答案 0 :(得分:1)
这是一个已经修复的旧bug。这是在使用开发版本。我相信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
答案 1 :(得分: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
问题在于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