You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助: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

火山引擎 最新活动