使用Pandas填充每日时间序列时遗漏00:00时刻缺失值的问题
解决Pandas时间序列补全及时区匹配问题
你的问题核心在于时区不匹配以及缺失了起始时间点的生成逻辑,下面一步步帮你解决:
问题分析
- 你之前生成的
time_range是不带时区的naive datetime,而原始数据的time列是带UTC时区的aware datetime,两者无法匹配,导致reindex后所有值变为NaN。 resample默认从现有数据的最早时间(00:10)开始生成频率序列,不会自动补全更早的00:00时间点。
完整解决方案
步骤1:确保时间列是带时区的datetime类型
首先确认你的time列已经被正确解析为带UTC时区的datetime:
data['time'] = pd.to_datetime(data['time'], utc=True)
步骤2:生成带时区的完整时间范围
手动生成包含2019-05-08 00:00:00+00:00到2019-05-08 23:50:00+00:00的10分钟间隔序列,必须指定时区为UTC:
start = pd.Timestamp('2019-05-08 00:00:00', tz='UTC') end = pd.Timestamp('2019-05-08 23:50:00', tz='UTC') full_time_range = pd.date_range(start=start, end=end, freq='10T')
步骤3:重新索引并填充缺失值
设置time为索引后,用完整时间范围重新索引,再针对不同列做填充:
# 设置索引并重新对齐到完整时间序列 data_full = data.set_index('time').reindex(full_time_range) # 填充站点信息(station_id和station_name是固定值,双向填充确保起始行也有值) data_full[['station_id', 'station_name']] = data_full[['station_id', 'station_name']].ffill().bfill() # 填充数值列:用前向填充,00:00会沿用00:10的数值,后续缺失值也会继承最近的有效值 data_full['value'] = data_full['value'].ffill() # 可选:重置索引,把time变回普通列 data_full = data_full.reset_index().rename(columns={'index': 'time'})
验证结果
执行后你会看到2019-05-08 00:00:00+00:00的行被补全,station_id、station_name保持和原数据一致,value填充为00:10的11,后续缺失的时间点也会按10分钟间隔补全并填充有效值。
简化版代码
如果你的站点信息全程不变,也可以用更简洁的方式:
data['time'] = pd.to_datetime(data['time'], utc=True) full_time_range = pd.date_range('2019-05-08 00:00:00', '2019-05-08 23:50:00', freq='10T', tz='UTC') data_full = data.set_index('time').reindex(full_time_range).assign( station_id=data['station_id'].iloc[0], station_name=data['station_name'].iloc[0] ).ffill()
内容的提问来源于stack exchange,提问作者user4296481
相关产品推荐
相关产品推荐

