python - 在 Pandas 数据框中筛选最接近月末的可用日期

标签 python date datetime pandas

使用 python 和 pandas,我尝试从雅虎财经下载证券价格数据,目的是最终获得时间序列中的月末调整价格。

我的代码如下所示。我使用 ix 来过滤数据框以生成业务月末日期列表。这适用于时间序列中除 2 个日期之外的所有日期,其中 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')]

关于python - 在 Pandas 数据框中筛选最接近月末的可用日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41076342/

相关文章:

java - 如何将时间戳值限制为秒?

SQL COUNT 按具有多个日期字段的每个日期

python - 在 Pycharm 中使用 Alt+Enter 神奇地导入时,如何让每个 python 导入在不同的行上?

javascript - Python 从 PGA 网站上的 JavaScript 表中抓取

python - 如何在 Python 中以 Base64 编码长?

javascript - 使用 jQuery 获取格式化的日期和时间

Javafx 使用日期选择器

java 9999-12-31 isodate 插入 mongodb 结果中作为插入的非 iso 日期

python - 为什么在python 3.7.2中使用PyImport_ImportModule segfault?

c - 在 scanf 中,如何忽略两个字符之一,但不能忽略两个字符?