求助:Quandl时间序列DataFrame频率无法通过infer_freq/freq推断
解决Quandl数据集无法推断日期频率的问题
我之前也碰到过一模一样的情况!其实问题出在Quandl返回的WIKI股票数据(比如你用的SLB斯伦贝谢数据)的日期序列上:它只包含交易日,周末、节假日都没有数据,属于不连续的DatetimeIndex。而pd.infer_freq需要日期序列是严格连续、有固定间隔的才能准确推断,这种有缺失的交易日序列它识别不出来,自然返回空;df.index.freq更不用说了,只有当索引创建时就指定了频率,或者后续手动设置过,才会有值,Quandl默认不会给你做这一步。
既然你已经知道数据是每日(工作日)频率,这里给你几个实用的解决办法:
1. 手动给索引设置频率属性
如果只是想让df.index.freq能返回对应的频率值,直接手动设置就行——注意股票数据用工作日频率'B'更贴合实际,要是你非要标记为日历日频率就用'D':
# 设置为工作日频率(更符合股票交易数据的实际) df.index.freq = 'B' # 或者强制设置为日历日频率 # df.index.freq = 'D' # 现在再调用就能拿到结果了 print(df.index.freq)
执行后会输出<BusinessDay>(对应'B')或者<Day>(对应'D'),完美解决无返回的问题。
2. 补全缺失日期并自动设置频率
如果需要把数据转换成连续的日历日序列(缺失日期的数值填充NaN),用asfreq方法就行,它会自动给索引加上freq属性:
# 转换为连续的日历日序列,缺失值填充NaN df_daily = df.asfreq('D') # 现在查看频率 print(df_daily.index.freq) # 输出<Day>
这样处理后,数据变成了完整的每日序列,索引的频率也明确了。
3. 直接输出已知的频率信息
要是你只是需要在代码里输出频率提示,既然已经确定是daily(工作日),直接打印就行,简单粗暴:
print("当前数据集的频率为:daily(工作日交易日)")
另外可以给你个小验证技巧,看看相邻日期的间隔分布,就能确认大部分是1天(工作日):
# 查看相邻日期的间隔统计 print(df.index.to_series().diff().value_counts())
你会看到大部分间隔是1天,少数是2天(周末)或者更长(节假日),这也能佐证数据的每日(工作日)特性。
内容的提问来源于stack exchange,提问作者a_jelly_fish




