0

私は大まかに次のようなnumpy配列を持っています:

data    
array([(datetime.datetime(2009, 1, 6, 2, 30), 17924.0, 0.0),....
           (datetime.datetime(2009, 1, 29, 16, 30), 35249.2, 521.25], 
         dtype=[('timestamp', '|O4'), ('x1', '<f8'), ('x2', '<f8')])

最初の列に基づいて (つまり、datetime オブジェクトを使用して) データのインデックスを作成できるようにしたいので、次のような特定の年/月/日のデータにアクセスできます。

data[data['timestamp'].year == 2009]

これは明らかに機能しません。私が考えることができる唯一のことは、追加の列(「年」列など)を追加することです。これでうまくいきます:

data[data['year'] == 2009]

物事を行うにはかなり非効率的な方法のようです (そして、多くのデータを複製します) - 特に、他のすべての時間間隔にもインデックスを付けたい場合...これを行うためのより良い方法はありますか?

前もって感謝します。

4

3 に答える 3

3

パンダを使用します。「pandasは、Pythonプログラミング言語用の高性能で使いやすいデータ構造とデータ分析ツールを提供するオープンソースのBSDライセンスライブラリです。」

ドキュメントにはたくさんの例がありますが、あなたはこのようにあなたが探していることをすることができます:

import pandas
import numpy as np
import datetime as dt

# example values
dates = np.asarray(pandas.date_range('1/1/2000', periods=8))

# create a dataframe
df = pandas.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])

# date you want
date=dt.datetime(2000,1,2)

# magic :)
print df.xs(date)

このモジュールをできるだけ早く学ぶことをお勧めします。それは絶対に例外的です。これは非常に単純な例です。非常に徹底的なドキュメントをチェックしてください。

于 2012-09-04T14:49:12.943 に答える
1

わかりましたので、具体的には「GroupBy」オブジェクトを使用して(上記のstrimp099で提案されているように、パンダを使用して)問題を解決したと思います(pandas :Group By:split-apply-combine)

上記の例を詳しく説明するには、次のようにします。

import pandas
import numpy as np
import datetime as dt

# example values
dates = np.asarray(pandas.DateRange('1/1/2000', periods=200))

# create a dataframe
df = pandas.DataFrame(np.random.randn(200, 4), index=dates, columns=['A', 'B', 'C', 'D'])

# create a GroupBy object
grouped_data = df.groupby(lambda x: x.month)

#magic
grouped_data.mean()
              A         B         C         D
month                                        
1     -0.492648 -0.038257 -0.224924  0.130182
2     -0.178995  0.236042 -0.471791 -0.369913
3     -0.261866 -0.024680 -0.107211 -0.195742
4      0.215505  0.077079 -0.057511  0.146193
5     -0.097043 -0.335736  0.302811  0.120170
6      0.187583  0.221954 -0.290655 -0.077800
7     -0.134988  0.013719 -0.094334 -0.107402
8     -0.229138  0.056588 -0.156174 -0.067655
9      0.043746  0.077781  0.230035  0.344440
10    -0.533137 -0.683788  0.395286 -0.957894

(つまり、月ごとにグループ化されたデータの平均)

また、複数のグループ化を行うには (つまり、私の場合は年と月)、これが役立つ場合があります。

grouped_data = df.groupby(lambda x: (x.year,x.month))

乾杯!

于 2012-09-05T04:44:19.900 に答える
0

numpyのdatetimedtypeを利用することもできます。私は2つのアプローチのベンチマークを行っていませんが、かなり近いかもしれません。次に例を示します。

import datetime
import numpy as np


def data_in(dates, year=2009):
    """ Return the dates within the given year. 
    Works only with dates being a numpy array with a datetime dtype.
    """

    from_date = np.array(('{}-01-01'.format(year), ), dtype='M8')
    to_date = np.array(('{}-12-31'.format(year),), dtype='M8')

    return dates[(dates > from_date) & (dates < to_date)]


if __name__ == '__main__':

    data = np.array(
        [
            (datetime.datetime(2009, 1, 6, 2, 30), 17924.0, 0.0),
            (datetime.datetime(2009, 1, 29, 16, 30), 35249.2, 521.25),
            (datetime.datetime(2011, 1, 29, 16, 30), 35249.2, 521.25),
        ], 
        dtype=[('timestamp', 'M8'), ('x1', '<f8'), ('x2', '<f8')]
    )

    for year in [2009, 2010, 2011]:
        print ' Timestamps in {}:\n {}'.format( year, data_in(data['timestamp'], year))
于 2012-09-05T16:15:59.840 に答える