1

Anaconda 2.1.0 (Python 2.7.8) で Blaze (0.6.3) を使用しています。テーブルの行の日付に基づくフィルターを使用しようとしています。

モック 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)]

最初の 2 つのフィルターは問題ありませんが、3 番目のフィルターは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

問題は、次のように pandas に変換される無効なYear値にあります。0001-01-01 00:00:00.02001-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 に答える