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

基于日期范围重新索引Pandas数据全为NaN的问题排查

Pandas重新索引后全为NaN的原因及解决办法

问题描述

尝试为Pandas数据框补充周末、节假日等缺失日期,执行以下代码后结果全为NaN:

import pandas as pd
import yfinance as yf 
import datetime 

start = datetime.date(2015,1,1)
end = datetime.date.today()

df = yf.download('F', start, end, interval ='1d', progress = False)
df.index = df.index.strftime('%Y-%m-%d')
full_dates = pd.date_range(start, end)
df.reindex(full_dates)

补充疑问:是否和Python版本有关?分别在Python3.7和3.10中运行相同代码,确认Python3.10中未使用strftime时下载数据的索引为datetime类型。

原因分析

  • 索引类型不匹配:代码中通过df.index.strftime('%Y-%m-%d')将原数据框的索引转为了字符串类型,而pd.date_range(start, end)生成的full_dates是datetime64类型。两者类型不同,无法匹配对应行,导致reindex后所有值变为NaN。
  • 与Python版本无关:Python3.7和3.10的差异仅体现在索引的显示形式,但核心问题是索引类型不统一,和版本没有直接关系。

解决办法

方法1:保持索引为datetime类型(推荐)

不需要将索引转为字符串,直接使用原生的datetime类型进行匹配:

import pandas as pd
import yfinance as yf 
import datetime 

start = datetime.date(2015,1,1)
end = datetime.date.today()

df = yf.download('F', start, end, interval ='1d', progress = False)
full_dates = pd.date_range(start, end)
# 直接用datetime类型的索引重新匹配
df = df.reindex(full_dates)

方法2:统一转为字符串类型索引

如果业务需求必须使用字符串格式的日期索引,需将full_dates也转为字符串类型:

import pandas as pd
import yfinance as yf 
import datetime 

start = datetime.date(2015,1,1)
end = datetime.date.today()

df = yf.download('F', start, end, interval ='1d', progress = False)
df.index = df.index.strftime('%Y-%m-%d')
# 将生成的日期范围转为字符串格式
full_dates = pd.date_range(start, end).strftime('%Y-%m-%d')
df = df.reindex(full_dates)

内容的提问来源于stack exchange,提问作者Slartibartfast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:25:27