首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据Pandas数据帧中最接近月末的可用日期进行过滤

根据Pandas数据帧中最接近月末的可用日期进行过滤
EN

Stack Overflow用户
提问于 2016-12-10 21:55:29
回答 2查看 1.9K关注 0票数 2

使用python和pandas,我试图从雅虎财经下载安全价格数据,目的是在时间序列中得出月末调整后的价格。

我的代码如下所示。我已经使用ix过滤了数据帧,以生成一个商业月末日期列表。这适用于时间序列中除两个日期之外的所有日期,其中2010年5月31日和2013年3月29日都显示为空白,我认为这是因为这是美国的联邦假日。

与其尝试为交易日创建日历,是否可以创建一个自定义频率或日历来简单地查找月末日期,如果它不可用,则检查以前的日期,直到找到一个值?例如,2013年3月31日没有数据,因此请检查30月30日(无数据)、29月29日(无数据)、28月28日(数据) ->显示屏连续显示28月28日。

代码语言:javascript
复制
import io
import requests
from datetime import datetime
import pandas

ticker = 'SPY'
start_date = '2009-12-31'
end_date = '2016-12-08'
s_dt = datetime.strptime(start_date, '%Y-%m-%d')
e_dt = datetime.strptime(end_date, '%Y-%m-%d')

url = 'http://chart.finance.yahoo.com/table.csv?s={0}&a={1}&b={2}&c={3}&d={4}&e={5}&f={6}&g=d&ignore=.csv'
url = url.format(ticker, s_dt.month-1, s_dt.day, s_dt.year, e_dt.month-1, e_dt.day, e_dt.year)
data = requests.get(url).content

df = pandas.read_csv(io.StringIO(data.decode('utf-8')))
df.drop('Open', 1, inplace=True)
df.drop('High', 1, inplace=True)
df.drop('Low', 1, inplace=True)
df.drop('Volume', 1, inplace=True)
df.drop('Close', 1, inplace=True)
df.columns = ['date', ticker]

df['date'] = pandas.to_datetime(df['date'], format='%Y-%m-%d')    
df = df.set_index('date')
df = df.ix[pandas.date_range(start=start_date, end=end_date, freq='BM')]
EN

回答 2

Stack Overflow用户

发布于 2016-12-10 22:54:23

我想出了一种通过使用fillna方法来实现我想要的东西的方法。

我的原始代码的最后一行应该替换为:

代码语言:javascript
复制
# expand series to add all dates in date range
df = df.ix[pandas.date_range(start=start_date, end=end_date, freq='d')]
# fill in the NaN values with the last available value
df = df.fillna(method='pad')
# reduce series to just business month-end dates
df = df.ix[pandas.date_range(start=start_date, end=end_date, freq='BM')]
票数 2
EN

Stack Overflow用户

发布于 2016-12-10 23:20:31

您可以使用pandas_datareader获取所有原始的每日数据(如果您还没有的话,可以使用pip install)

然后你就会这么做

代码语言:javascript
复制
from pandas_datareader.data import DataReader
df = DataReader('SPY', 'yahoo', '2009-12-31', '2016-12-08') 

您可以跳过后期处理步骤,直接获取月度数据,但此操作的接口有点繁琐,您将这样做:

代码语言:javascript
复制
from pandas_datareader.yahoo.daily import YahooDailyReader 
df_monthly = YahooDailyReader('SPY', '2009-12-31', '2016-12-08', interval='m').read()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41076342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档