将黄金数据重索引至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
相关产品推荐
相关产品推荐

