いくつかのセットアップ:
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: from datetime import datetime
In [4]: dates = [datetime(2011, 1, 2), datetime(2011, 1, 5), datetime(2011, 1, 7), datetime(2011, 1, 8), datetime(2011, 1, 10), datetime(2011, 1, 12)]
In [5]: ts = pd.Series(np.random.randn(6), index=dates)
In [6]: ts
Out[6]:
2011-01-02 -0.412335
2011-01-05 -0.809092
2011-01-07 -0.442320
2011-01-08 -0.337281
2011-01-10 0.522765
2011-01-12 1.559876
さて、あなたの最初の質問に答えましょう。これは非常に簡単です:
In [9]: ts[datetime(2011, 1, 8):]
Out[9]:
2011-01-08 -0.337281
2011-01-10 0.522765
2011-01-12 1.559876
これは、選択した日付以降のすべての値を含むスライスです。次の方法で、必要に応じて最初のものだけを選択できます。
In [10]: ts[datetime(2011, 1, 8):][0]
Out[10]: -0.33728079849770815
2 番目の質問 (b) に対して、このタイプのインデックス付けは、他の numpy 配列と同様に、元のスライスです。オリジナルのコピーではありません。この質問、または同様の多くの質問を参照してください:
バグまたは機能: numpy array w/ slicing のクローン作成
実証するために、スライスを変更してみましょう。
In [21]: ts2 = ts[datetime(2011, 1, 8):]
In [23]: ts2[0] = 99
ts2 はスライスでありコピーではないため、これにより元の timeseries オブジェクト ts が変更されます。
In [24]: ts
Out[24]:
2011-01-02 -0.412335
2011-01-05 -0.809092
2011-01-07 -0.442320
2011-01-08 99.000000
2011-01-10 0.522765
2011-01-12 1.559876
コピーが必要な場合は、(一般に) copy メソッドを使用するか、(この場合は) truncate を使用できます。
In [25]: ts3 = ts.truncate(before='2011-01-08')
In [26]: ts3
Out[26]:
2011-01-08 99.000000
2011-01-10 0.522765
2011-01-12 1.559876
このコピーを変更しても、オリジナルは変更されません。
In [27]: ts3[1] = 99
In [28]: ts3
Out[28]:
2011-01-08 99.000000
2011-01-10 99.000000
2011-01-12 1.559876
In [29]: ts #The january 10th value will be unchanged.
Out[29]:
2011-01-02 -0.412335
2011-01-05 -0.809092
2011-01-07 -0.442320
2011-01-08 99.000000
2011-01-10 0.522765
2011-01-12 1.559876
この例は、Wes による「Python for Data Analysis」から直接引用したものです。見てみな。それは素晴らしい。