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
相关产品推荐
相关产品推荐

