在python中选择月份开始和结束数据

时间:2016-06-22 16:05:13

标签: python pandas

我有从雅虎财经下载的股票数据。我想在每月开始和月末对应的行中拾取数据。我试图用python pandas数据框做到这一点。但是我没有得到正确的方法来获得首发&月末。如果有人可以帮我解决这个问题,那将会非常充实。 请注意,如果该月的第一天是假日且没有相关数据,我需要提取第二天的数据。同样的规则也适用于本月的最后一天。提前谢谢。

示例数据

2016-01-05,222.80,222.80,217.00,217.75,15074800,217.75
2016-01-04,226.95,226.95,220.05,220.70,14092000,220.70
2015-12-31,225.95,226.55,224.00,224.45,11558300,224.45
2015-12-30,229.00,229.70,224.85,225.80,11702800,225.80
2015-12-29,228.85,229.95,227.50,228.20,7263200,228.20
2015-12-28,229.05,229.95,228.00,228.90,8756800,228.90
........
........
2015-12-04,240.00,242.15,238.05,241.10,11115100,241.10
2015-12-03,244.15,244.50,240.40,241.10,7155600,241.10
2015-12-02,250.55,250.65,243.75,244.60,10881700,244.60
2015-11-30,249.65,253.00,245.00,250.20,12865400,250.20
2015-11-27,243.00,250.50,242.80,249.70,15149900,249.70
2015-11-26,241.95,244.90,241.00,242.50,13629800,242.50

3 个答案:

答案 0 :(得分:0)

对于每个月的第一天/最后一天,您可以将.resample()'BMS''BM'一起用于Business Month (Start),如此(使用pandas 0.18语法) :

df.resample('BMS').first()
df.resample('BM').last()

这假设您使用DateTimeIndexyahoo下载时,数据与往常一样pandas_datareader

from datetime import datetime
from pandas_datareader.data import DataReader
df = DataReader('FB', 'yahoo', datetime(2015, 1, 1), datetime(2015, 3, 31))['Open']

df.head()

Date
2015-01-02    78.580002
2015-01-05    77.980003
2015-01-06    77.230003
2015-01-07    76.760002
2015-01-08    76.739998
Name: Open, dtype: float64
df.tail()

Date
2015-03-25    85.500000
2015-03-26    82.720001
2015-03-27    83.379997
2015-03-30    83.809998
2015-03-31    82.900002
Name: Open, dtype: float64

做的:

df.resample('BMS').first()

Date
2015-01-01    78.580002
2015-02-02    76.110001
2015-03-02    79.000000
Freq: BMS, Name: Open, dtype: float64

df.resample('BM').last()

得到:

Date
2015-01-30    78.000000
2015-02-27    80.680000
2015-03-31    82.900002
Freq: BM, Name: Open, dtype: float64

答案 1 :(得分:0)

首先,您应该将日期列转换为日期时间格式,然后逐月转换,然后按日期对groupby进行排序,并使用head / tail方法从中获取第一个/最后一个,如下所示:

In [37]: df
Out[37]:
           0       1       2       3       4         5       6
0 2016-01-05  222.80  222.80  217.00  217.75  15074800  217.75
1 2016-01-04  226.95  226.95  220.05  220.70  14092000  220.70
2 2015-12-31  225.95  226.55  224.00  224.45  11558300  224.45
3 2015-12-30  229.00  229.70  224.85  225.80  11702800  225.80
4 2015-12-29  228.85  229.95  227.50  228.20   7263200  228.20
5 2015-12-28  229.05  229.95  228.00  228.90   8756800  228.90
In [25]: import datetime

In [29]: df[0] = df[0].apply(lambda x: datetime.datetime.strptime(x, '%Y-%m-%d')
)
In [36]: df.groupby(df[0].apply(lambda x: x.month)).apply(lambda x: x.sort_value
s(0).head(1))
Out[36]:
              0       1       2       3      4         5      6
0
1  1 2016-01-04  226.95  226.95  220.05  220.7  14092000  220.7
12 5 2015-12-28  229.05  229.95  228.00  228.9   8756800  228.9

In [38]: df.groupby(df[0].apply(lambda x: x.month)).apply(lambda x: x.sort_value
s(0).tail(1))
Out[38]:
              0       1       2      3       4         5       6
0
1  0 2016-01-05  222.80  222.80  217.0  217.75  15074800  217.75
12 2 2015-12-31  225.95  226.55  224.0  224.45  11558300  224.45

您可以使用pd.concat()

合并结果数据帧

答案 2 :(得分:0)

假设您已从Yahoo下载数据:

> import pandas.io.data as web 

> import datetime

> start = datetime.datetime(2016,1,1) 

> end = datetime.datetime(2016,5,1)

> df = web.DataReader("AAPL", "yahoo", start, end)

您只需选择月末并以:

开始行
df[df.index.is_month_end] 

df[df.index.is_month_start]

如果您想访问特定行,例如所选开始日期的第一个开始日期的第一行,您只需执行以下操作:

df[df.index.is_month_start].ix[0]