一些设置:
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
好的,现在回答您的第一个问题,a)是的,根据您的意图,有一些不那么笨重的方法。这很简单:
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
对于您的第二个问题,(b) - 这种类型的索引是原始索引的一部分,就像其他 numpy 数组一样。它不是原件的副本。请参阅此问题或许多类似问题:
Bug or feature: cloning a numpy array w/ slicing
为了演示,让我们修改切片:
In [21]: ts2 = ts[datetime(2011, 1, 8):]
In [23]: ts2[0] = 99
这会更改原始时间序列对象 ts,因为 ts2 是切片而不是副本。
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”。看看这个。这很棒。