Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据框中筛选离月末最近的可用日期_Python_Date_Datetime_Pandas - Fatal编程技术网

Python 在数据框中筛选离月末最近的可用日期

Python 在数据框中筛选离月末最近的可用日期,python,date,datetime,pandas,Python,Date,Datetime,Pandas,使用python和pandas,我试图从Yahoo Finance下载安全价格数据,目的是以时间序列的月末调整价格结束 我的代码如下所示。我已经使用ix来过滤数据框,以生成业务月结束日期的列表。这适用于时间序列中除两个日期外的所有日期,其中2010年5月31日和2013年3月29日都显示为空白,我认为这是因为这是美国的联邦假日 与其尝试为交易日创建日历,是否可以创建一个自定义频率或日历,只查找月末日期,如果不可用,则检查以前的日期,直到找到值?例如,2013年3月31日没有数据,因此检查3月30

使用python和pandas,我试图从Yahoo Finance下载安全价格数据,目的是以时间序列的月末调整价格结束

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

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

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')]

我用fillna方法找到了一种实现我想要的东西的方法

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

# 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')]

您可以使用
pandas\u datareader
pip-install
it,如果您还没有它)获取所有原始每日数据

那你就这么做吧

from pandas_datareader.data import DataReader
df = DataReader('SPY', 'yahoo', '2009-12-31', '2016-12-08') 
您可以跳过后期处理步骤,直接获取月度数据,但此操作的界面有点挑剔,您可以这样做:

from pandas_datareader.yahoo.daily import YahooDailyReader 
df_monthly = YahooDailyReader('SPY', '2009-12-31', '2016-12-08', interval='m').read()

你不能直接使用熊猫数据阅读器吗?例如,这个问题:谢谢——我以前从未听说过熊猫数据阅读器。我会调查的。如果你还没有它,你需要安装它。然后您只需从pandas_datareader.data import datareader执行
,您的完整数据框架将是
df=datareader('SPY'、'yahoo'、'2009-12-31'、'2016-12-08')
除非您真的必须使用
.ix
。改用
.loc
.loc