0

Pandas で TimeStamp の選択に問題があります。

私が見ているのは、他の人が抱えている問題です ( TimeStamps のリストを持つ DatetimeIndex によってインデックス付けされた Pandas DataFrame のサブセットを選択する) が、Pandas の開発者は残念ながらそれをバグとして受け入れることを拒否しています ( https://github. com/pydata/pandas/issues/2437 )。

いずれにせよ、上記で引用した SO の投稿で提案された回避策に従うことができませんでした。これは、データが CSV ファイルではなく、いくつかのリストに含まれているためです (実際には、JSON を介してインターネットから取得し、変換します)。それをリストに)。

取得したデータは次のようなものです。

the_dataTransactions
[{u'date': u'1365100630', u'tid': 240264, u'price': u'132.58', u'amount': u'1.28309000'}, {u'date': u'1365100630', u'tid': 240263, u'price': u'132.58', u'amount': u'1.20294000'}, {u'date': u'1365100629', u'tid': 240262, u'price': u'132.58', u'amount': u'0.90893940'}]

そして、私はそれを次のように変換します:

transactionsDate
[datetime.datetime(2013, 4, 4, 19, 37, 10), datetime.datetime(2013, 4, 4, 19, 37, 10), datetime.datetime(2013, 4, 4, 19, 37, 9)]

また、これも試しましたが、データ範囲を選択しようとしたときの結果のエラーは同じでした:

transactionsDate
[<Timestamp: 2013-04-04 19:37:10>, <Timestamp: 2013-04-04 19:37:10>, <Timestamp: 2013-04-04 19:37:09>]

また、tid、price、および amount も次のようなデータ フレームに追加されます。

>>> transactionsDF.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 73 entries, 2013-04-04 19:37:10 to 2013-04-04 19:22:49
Data columns:
tid       73  non-null values
price     73  non-null values
amount    73  non-null values
dtypes: float64(2), int64(1)

>>> transactionsDF.head()
                        tid   price    amount
2013-04-04 19:37:10  240264  132.58  1.283090
2013-04-04 19:37:10  240264  132.58  1.283090
2013-04-04 19:37:10  240263  132.58  1.202940
2013-04-04 19:37:09  240262  132.58  0.908939
2013-04-04 19:37:09  240261  132.59  0.213051

しかし、通常の表記法を使用してデータ範囲を選択しようとすると、他の投稿で報告されているのと同じエラーが発生します。

>>> transactionsDF['2013-04-03 18:00:00':'2013-04-04 19:00:00']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/frame.py", line 1951, in __getitem__
    indexer = self.ix._convert_to_indexer(key, axis=0)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/indexing.py", line 478, in _convert_to_indexer
    i, j = labels.slice_locs(start, stop)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/tseries/index.py", line 1153, in slice_locs
    start_loc = self._get_string_slice(start).start
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/tseries/index.py", line 1143, in _get_string_slice
    loc = self._partial_date_slice(reso, parsed)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/tseries/index.py", line 1041, in _partial_date_slice
    raise TimeSeriesError('Partial indexing only valid for ordered '
pandas.tseries.index.TimeSeriesError: Partial indexing only valid for ordered time series.

私のデータは順序付けられた時系列になっているようです。この特定のケースで、この Pandas の不具合の回避策を考えてもらえますか?

UPDATE(解決済み?): 毎回正しい答えが得られるかどうか完全にはわからないほど単純な方法を見つけましたが、少なくとも小さなデータフレームでは機能しています。コードは次のとおりです。

transactionsDF = transactionsDF.sort_index()

そして、これが正常に機能しているようで、他のデータで使用していたようにデータ範囲を選択できるようになりました: transactionsDF['2013-04-04 19:30':'2013-04-04 19:35']

おそらく、より知識のある人がこの回避策を検証または無効にする可能性があります。

4

1 に答える 1

1

本当にエレガントな解決策はないと思います。Pandas は重複したインデックスを好みません。(少なくとも私が持っている少し古いバージョンです。) 重複したインデックスを持つ DataFrame を作成できますが、コンテンツに快適にアクセスすることはできません。

したがって、日付を別の列に入れる必要があります。次に、日付の比較演算子と派手なインデックスを使用して、興味深い行にアクセスします。

In [1]: import pandas as pd

In [5]: import datetime

In [15]: f1 = pd.DataFrame([{u'date': u'1365100630', u'tid': 240264, u'price': u'132.58', u'amount': u'1.28309000'}, {u'date': u'1365100630', u'tid': 240263, u'price': u'132.58', u'amount': u'1.20294000'}, {u'date': u'1365100629', u'tid': 240262, u'price': u'132.58', u'amount': u'0.90893940'}])

In [16]: f1["dates"] = [datetime.datetime(2013, 4, 4, 19, 37, 10), datetime.datetime(2013, 4, 4, 19, 37, 10), datetime.datetime(2013, 4, 4, 19, 37, 9)]

In [17]: f1
Out[17]: 
       amount        date   price     tid                dates
0  1.28309000  1365100630  132.58  240264  2013-04-04 19:37:10
1  1.20294000  1365100630  132.58  240263  2013-04-04 19:37:10
2  0.90893940  1365100629  132.58  240262  2013-04-04 19:37:09

In [25]: matching = (f1["dates"] >= datetime.datetime(2013, 4, 4, 19, 37, 10)) & (f1["dates"] < datetime.datetime(2013, 4, 4, 20, 00, 00))

In [26]: f1.ix[matching]
Out[26]: 
       amount        date   price     tid                dates
0  1.28309000  1365100630  132.58  240264  2013-04-04 19:37:10
1  1.20294000  1365100630  132.58  240263  2013-04-04 19:37:10

を使用して興味深い行にアクセスすることもできf1[matching]ますが、列にアクセスするために使用されるため、あまり明確ではありませんf1["foo"]

于 2013-04-04T20:11:09.337 に答える