如何使用Python在时间序列或DataFrame中筛选日期范围
解决Alpha Vantage日期筛选空DataFrame/报错的问题
嘿,作为Python新手碰到这种问题真的很常见,我帮你拆解下代码里的问题,再给你修正后的方案:
你的代码里的几个关键问题:
- 变量名错误:你最后用了
df.loc[...],但代码里根本没定义df,你实际定义的是data,这会直接抛出NameError。 - 索引类型不匹配:Alpha Vantage返回的
data_daily的索引是字符串格式的日期(比如'2024-05-20'),但你用datetime.date对象去切片,两者类型不兼容,所以会返回空DataFrame。 - 小细节疏漏:你注释里的
data[:'2019-11-29'],当时data还没定义,应该是data_daily。
修正后的完整代码:
import pandas as pd from alpha_vantage.timeseries import TimeSeries from datetime import datetime stock_ticker = 'SPY' api_key = open('/content/drive/My Drive/Colab Notebooks/key').read() # 初始化TimeSeries并获取数据 ts = TimeSeries(key=api_key, output_format="pandas") data_daily, meta_data = ts.get_daily_adjusted(symbol=stock_ticker, outputsize='full') # 将字符串索引转换为datetime类型(关键步骤!) data = data_daily.copy() data.index = pd.to_datetime(data.index) # 方法1:用字符串日期切片 filtered_data_str = data['2014-01-01':'2015-02-01'] # 方法2:用datetime对象切片 start_date = datetime(year=2014, month=1, day=1) end_date = datetime(year=2015, month=2, day=1) filtered_data_dt = data.loc[start_date:end_date] # 打印结果验证 print("用字符串切片的结果行数:", len(filtered_data_str)) print("用datetime对象切片的结果行数:", len(filtered_data_dt))
关键说明:
- 转换索引类型:
pd.to_datetime(data.index)把原来的字符串索引转成datetime64类型,这样Pandas才能正确识别日期范围进行切片。 - 两种切片方式都有效:转成datetime索引后,不管用字符串日期还是datetime对象切片,都能得到正确的结果。
- 避免变量名混淆:全程统一用
data或者df,别搞混了,不然容易报错。
你可以运行上面的代码试试,应该就能得到你想要的日期范围数据啦!
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

