在R的xts包中有一个名为endpoints
的函数,给定一个xts对象将返回给定月,周或任何用户指定频率的索引。如何用python在pandas中做到这一点?
R:
endpoints(xts.object, "frequency")
的Python:
from matplotlib.pylab import *
from pandas.io.data import DataReader
from datetime import datetime
symbols = ["SPY","IEF"]
data_holder = DataReader(symbols, "yahoo",datetime(2001,1,1))
adj_close = data_holder["Adj Close"] #adjusted close data
adj_close = adj_close.dropna() #drop NAs
adj_close.head() #inspect elements
我理解python中的重新采样功能以"M"
为参数将获得月度数据。但有没有办法获得索引数组,以便每个索引引用数据帧中的一行,这是一个月末日期?
这是一个具体的例子,我正在使用伪代码:
month_ends = adj_close.someFunction("months") #gives me the index of each month ends
month_ends.head()
[22,41,62..etc]
adj_close[month_ends,] #should give me the same thing as resampled("M")
答案 0 :(得分:3)
创建一个以[0, 1, ...]
作为值的系列,然后调用resample
:
s = pd.Series(np.arange(adj_close.shape[0]), index=adj_close.index)
locs = s.resample("M", how="max")
print locs
输出是:
Date
2002-07-31 0
2002-08-31 22
2002-09-30 42
2002-10-31 65
2002-11-30 85
2002-12-31 106
2003-01-31 127
2003-02-28 146
2003-03-31 167
2003-04-30 188
2003-05-31 209
2003-06-30 230
2003-07-31 252
2003-08-31 273
2003-09-30 294
...
2012-09-30 2561
2012-10-31 2582
2012-11-30 2603
2012-12-31 2623
2013-01-31 2644
2013-02-28 2663
2013-03-31 2683
2013-04-30 2705
2013-05-31 2727
2013-06-30 2747
2013-07-31 2769
2013-08-31 2791
2013-09-30 2811
2013-10-31 2834
2013-11-30 2844
Freq: M, Length: 137, dtype: int64
获取行:
print adj_close.iloc[locs, :].head(10)
输出:
IEF SPY
Date
2002-07-31 55.49 73.01
2002-08-30 56.89 73.51
2002-09-30 59.08 65.80
2002-10-31 58.34 71.22
2002-11-29 56.93 75.61
2002-12-31 58.95 71.33
2003-01-31 58.50 69.58
2003-02-28 59.79 68.64
2003-03-31 59.56 68.79
2003-04-30 59.64 74.61
答案 1 :(得分:1)
如果我理解正确,你正在寻找熊猫的DateOffset
:
http://pandas.pydata.org/pandas-docs/dev/timeseries.html#dateoffset-objects
那里有一些很好的例子,但是为了让你了解如何使用它:
import datetime
from pandas.tseries.offsets import *
a=datetime.datetime(2013,11,5)
print a + BMonthEnd() #Last Business day of the month,
OUT:datetime.datetime(2013, 11, 29, 0, 0)
print a + MonthEnd()
OUT: datetime.datetime(2013, 11, 30, 0, 0)
print a.weekday() # is 1, i.e. Tuesday
print a + Week(weekday=4) # Looking for Friday
OUT: 2013-11-08 00:00:00
上面应该为您提供正确的日期时间对象,然后您可以使用它来查询数据。
编辑:可能有更简单的方法可以做到这一点,但经过几杯啤酒之后,我用'df'数据框以这种方式得到了索引:a=list(df.index.values) # This copies the index into a list and allows you to do:
print a.index(np.datetime64(dt.datetime(2013,11,5) + Week(weekday=4))
OUT: The row number of the end of the week
df.index.values
会返回没有ndarray
方法的index()
,因此您需要将其转换为具有此方法的列表。
注意,我使用pd.data_range
生成了使用numpy.datetime64
个对象的索引。
因此,在您使用dt.datetime(yyyy,mm,dd)+Week(weekday=4)
找到本周末的最后一天后,您可以将其转换为numpy.datetime64
对象,然后在列表中搜索其索引。