处理时区感知Datetime索引:解决yfinance股息数据筛选的时区警告
问题出在你用的start和end是时区朴素的date对象,而yfinance返回的stock.dividends的索引是带UTC时区的DatetimeIndex,pandas未来版本会禁止这种跨时区的索引切片,所以抛出了FutureWarning。
下面给你几种可行的替代方案:
方案1:将日期转为带UTC时区的Timestamp(推荐)
直接把起始/结束日期转换成和股息数据索引同时区的Timestamp,时区匹配后就不会有警告:
import pandas as pd import yfinance as yf import datetime from datetime import timedelta st_dni = 1000 # 转为UTC时区的Timestamp,normalize()去掉时间部分只保留日期 end = pd.Timestamp.now(tz='UTC').normalize() start = end - timedelta(days=st_dni) ticker = 'XOM' stock = yf.Ticker(ticker) temp = pd.DataFrame(stock.dividends) div = temp.loc[start:end] print(div)
方案2:移除股息数据索引的时区
如果不需要保留时区信息,可以把temp的索引转为时区朴素的DatetimeIndex,就能和原来的date对象兼容:
import pandas as pd import yfinance as yf import datetime from datetime import timedelta st_dni = 1000 end = datetime.date.today() start = end - timedelta(days=st_dni) ticker = 'XOM' stock = yf.Ticker(ticker) temp = pd.DataFrame(stock.dividends) # 移除索引的时区信息 temp.index = temp.index.tz_localize(None) div = temp.loc[start:end] print(div)
方案3:使用布尔索引筛选
直接用布尔条件筛选日期范围,这种方式更直观,也能避开时区问题:
import pandas as pd import yfinance as yf import datetime from datetime import timedelta st_dni = 1000 end = datetime.date.today() start = end - timedelta(days=st_dni) ticker = 'XOM' stock = yf.Ticker(ticker) temp = pd.DataFrame(stock.dividends) # 用布尔索引筛选,pandas会自动处理date和带时区datetime的比较 div = temp[(temp.index >= start) & (temp.index <= end)] print(div)
注意:方案2和3要留意时区转换可能带来的日期偏移问题(比如UTC转本地时间可能导致日期差一天),如果需要精确匹配,优先用方案1。
内容的提问来源于stack exchange,提问作者Blaz
相关产品推荐
相关产品推荐

