基于日期范围重新索引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
相关产品推荐
相关产品推荐

