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

Pandas reindex后非索引列全为NaN问题及不连续时间戳气象数据处理

Pandas reindex后非索引列全变NaN?处理不连续时间戳气象数据的坑

最近处理气象站的CSV数据时踩了个大坑:用reindex补全不连续的时间戳后,所有温度、湿度这些非索引列直接变成NaN了!给大家看看我的数据和操作过程,求指点问题出在哪。

我的数据样例(CSV)

logstamp,temp,rh,snow,wind,gust,wind_dir
2018-01-26 21:00:00,-10.120,63.93,207.1,4.018,9.806,173.900
2018-01-26 22:00:00,-9.750,58.54,207.0,3.856,11.149,158.500
2018-01-26 23:00:00,-9.710,60.92,206.9,6.505,13.759,159.100
2018-01-27 00:00:00,-10.110,57.45,206.7,6.602,12.488,167.700
2018-01-28 13:00:00,-7.574,84.90,212.4,5.594,15.736,134.100
2018-01-28 14:00:00,-4.347,88.20,213.1,5.663,15.242,170.700
2018-01-28 15:00:00,-2.110,82.31,213.5,4.981,12.802,165.400

我的操作步骤

先是读入数据,把时间列转成datetime并设为索引:

import pandas as pd

# 读入数据
df = pd.read_csv('weather_log.csv')
# 转换时间格式
df['logstamp'] = pd.to_datetime(df['logstamp'])
# 设置为索引
df.set_index('logstamp', inplace=True)

然后生成连续的小时级时间序列,想用reindex对齐数据:

# 生成目标连续时间索引
new_index = pd.date_range(start='2018-01-26 21:00:00', end='2018-01-28 15:00:00', freq='H')
# 重新索引
df_reindexed = df.reindex(new_index)

结果一看,df_reindexed里除了新的时间索引,temp、rh这些列全是NaN!明明原数据里有对应时间点的数值啊,这就离谱。

问题排查&解决办法

折腾了半天,发现大概率是时间戳的精度不匹配导致的!

1. 先检查原索引的细节

先打印原索引的类型和具体值,看看是不是有隐藏的精度:

print("原索引类型:", df.index.dtype)
print("原索引详情:", df.index)

如果发现原索引是datetime64[ns],但实际时间戳带了微秒(比如原CSV里的时间其实是2018-01-26 21:00:00.000000,只是显示时省略了),而我们生成的new_index是整小时的(没有微秒部分),这时候reindex会因为时间戳完全不匹配,导致所有列变NaN。

2. 解决办法:统一时间精度

有两种方式可以解决:

  • 方式一:截断原索引到小时级
    把原索引的时间戳截断到小时,消除微秒的影响:
# 将原索引截断到小时
df.index = df.index.floor('H')
# 重新索引
df_reindexed = df.reindex(new_index)
  • 方式二:生成和原索引精度一致的新索引
    在生成new_index时,指定和原索引相同的dtype:
new_index = pd.date_range(
    start='2018-01-26 21:00:00',
    end='2018-01-28 15:00:00',
    freq='H',
    dtype='datetime64[ns]'
)
df_reindexed = df.reindex(new_index)

3. 额外小技巧:读数据时直接处理时间

其实可以在read_csv的时候一步到位处理时间列,避免手动转换可能出的错:

df = pd.read_csv(
    'weather_log.csv',
    parse_dates=['logstamp'],  # 自动解析时间列
    index_col='logstamp'       # 直接设为索引
)

验证结果

处理完之后再看df_reindexed,原数据里有的时间点会正常显示数值,缺失的时间点才会是NaN,这就达到我们补全时间序列的目的啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:41:35