You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理时区感知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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:46:10