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

将黄金数据重索引至DateTimeIndex后价格全为NaN问题求助

问题分析与解决办法

核心原因1:时区不匹配

你的原数据索引是带UTC时区的datetime对象(因为用了pd.to_datetime(utc=True)),但pd.date_range生成的years是**无时区(naive)**的datetime,两者索引类型不兼容,导致reindex时完全匹配不到,所以Price列全为NaN。

解决方法:统一时区

给pd.date_range指定UTC时区,或者移除原数据索引的时区:

  • 方法1:生成带UTC时区的日期范围
years = pd.date_range('01/01/1950', '01/01/2020', freq='YS', tz='UTC')
reindexed = gold.reindex(years)
  • 方法2:移除原数据索引的时区
gold = gold.tz_localize(None)  # 去掉UTC时区
years = pd.date_range('01/01/1950', '01/01/2020', freq='YS')
reindexed = gold.reindex(years)

核心原因2:原数据无对应日期记录

即使时区统一了,如果原数据中没有每年1月1日的黄金价格记录,reindex的严格匹配还是会返回NaN。这时候需要用填充或匹配最近值的方式处理:

解决方法:填充缺失值或匹配最近日期

  • 方法1:用前向填充(ffill)/后向填充(bfill)补全NaN
# 统一时区后,用前向填充,取上一条有效数据的值
reindexed = gold.reindex(years, method='ffill')
# 或后向填充,取下一条有效数据的值
reindexed = gold.reindex(years, method='bfill')
  • 方法2:匹配最近的日期(更精准,适合金融数据)
    用pd.merge_asof找到每年1月1日之前最近的有效数据:
years_df = pd.DataFrame({'Date': years})
# 确保原数据索引是datetime(无时区或与时区统一)
gold_reset = gold.reset_index()
# 按日期匹配最近的前序数据
merged = pd.merge_asof(years_df, gold_reset, on='Date', direction='backward')
merged = merged.set_index('Date')

生成折线图

处理完数据后,直接用pandas绘图:

merged['Price'].plot(figsize=(10,6), title='Gold Price on Jan 1st (1950-2020)')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:13:11