求助:Quandl时间序列DataFrame无法自动推断频率问题
解决Quandl数据集无法推断/查看时间频率的问题
Hey there, let's break down why you're not getting a frequency result from pd.infer_freq() or df.index.freq, and how to fix it:
问题原因
Quandl的股票类数据集(比如你用的WIKI/SLB)是交易日数据,不是连续的日历日——它会跳过周末、节假日,导致时间序列存在间隔。这就触发了两个关键点:
pd.infer_freq()需要连续、规律的时间间隔才能推断频率,一旦有缺失的日期(比如周末),它无法确定统一的频率,所以返回None。df.index.freq只有当你的DatetimeIndex是由固定频率规则生成的(比如用pd.date_range()创建,或者resample后的结果)才会有值。从Quandl获取的原始索引是基于实际交易日期的集合,没有预设的频率属性,所以也返回None。
解决方案
既然你已经知道数据是日度(交易日)频率,这里有两种实用方法:
1. 手动标记频率(最简单)
直接给索引设置工作日频率('B'代表Business Day,符合股票交易日规则),之后就能正常查看频率了:
# 手动设置工作日频率 df.index.freq = 'B' # 打印查看频率 print("数据集的时间频率:", df.index.freq)
2. 生成连续的固定频率索引(如果需要补全缺失日期)
如果需要让索引变成连续的工作日序列(填充缺失日期的NaN值),可以用reindex方法:
# 生成从数据起始到结束的连续工作日索引 continuous_idx = pd.date_range(start=df.index.min(), end=df.index.max(), freq='B') # 重新索引,缺失日期会填充NaN(可根据需求用ffill/bfill填充数据) df_continuous = df.reindex(continuous_idx) # 现在查看频率会直接返回<BDay> print("连续数据集的时间频率:", df_continuous.index.freq)
3. 验证实际时间间隔(可选)
如果你想确认数据的实际时间间隔统计,可以用这个代码:
# 计算相邻日期的间隔,然后取平均值 avg_interval = df.index.to_series().diff().mean() print("数据的平均时间间隔:", avg_interval)
这样就能轻松查看和标记你的数据集频率啦!
内容的提问来源于stack exchange,提问作者a_jelly_fish




