首页 > 解决方案 > 如何更改时间序列中的索引频率

问题描述

我正在使用 yfinance 库来导入给定股票的数据。请参见下面的代码:

import yfinance as yf
from datetime import datetime as dt
import pandas as pd

# Naming Constants
stock = "AAPL"
start_date = "2014-01-01"
end_date = "2018-01-01"

# Importing all the data into a dataFrame
stock_data = yf.download(stock, start=start_date, end=end_date)

当我打电话时,print(stock_data.index)我有以下内容:

DatetimeIndex(['2014-01-02', '2014-01-03', '2014-01-06', '2014-01-07', '2014-01-08', '2014-01-09', '2014-01-10', '2014-01-13', '2014-01-14', '2014-01-15',
               ...
               '2017-12-15', '2017-12-18', '2017-12-19', '2017-12-20', '2017-12-21', '2017-12-22', '2017-12-26', '2017-12-27', '2017-12-28', '2017-12-29'],
              dtype='datetime64[ns]', name='Date', length=1007, freq=None)

我希望将频率参数从无切换到每天,因为每个日期都指一个交易日。

当我说stock_data.index.freq = 'B'我收到以下错误时:

ValueError: Inferred frequency None from passed values does not conform to passed frequency B

如果我输入 stock_data = stock_data.asfreq('B'),它会改变频率,但它会添加最初不存在的某些行并用 NA 值填充它们。

换句话说,交易日使用的偏移 ALIAS 是多少?

您可以在此处从 Pandas 文档中找到别名列表:https ://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases

标签: pythonpandas

解决方案


错误stock_data.index.freq = 'B'表明您的时间序列频率不是“工作日”,而是未定义或“无”。

stock_data = stock_data.asfreq('B')

您正在将时间序列重新索引为业务每日频率:将添加缺少的时间戳,并将缺少的股票数据值设置为 NaN。现在你需要决定如何替换它们,所以看看这里:pandas.DataFrame.asfreq。因此,您可以将所有 NaN 替换为固定值(例如 -999),但一般而言,您想要对股票数据执行的操作是在给定时间点获取最后一个有效值,这是向前填补空白:

stock_data = stock_data.asfreq('B', method='ffill')

总是值得阅读文档。


推荐阅读