Python中为DataFrame补全起始缺失时间戳并插值的方法
补全DataFrame起始缺失时间戳并完成插值降采样
问题背景
从服务器获取的高采样率(2-3秒间隔)DataFrame,起始时间晚于需求的时间范围(比如需求00:00:00至23:59:59,但第一个数据点是00:11:52),需要补全起始段的分钟级时间戳,用NaN填充对应数据列,之后插值处理所有缺失值,最终降采样至1分钟间隔。
解决方案步骤
- 生成缺失时间范围的DataFrame:创建包含需求起始到第一个数据点前所有分钟级时间戳的DataFrame,并自动添加与原数据一致的数值列,初始值设为NaN。
- 拼接数据:将缺失数据的DataFrame与原数据拼接,得到完整时间范围的数据集。
- 插值与降采样:设置时间列为索引,线性插值填充所有NaN,再按1分钟间隔重采样。
完整可运行代码
import numpy as np import pandas as pd import pyspedas from pytplot import get_data # 定义目标时间范围 AtimeRange = ["2012-01-22/00:00:00","2012-01-23/23:59:59"] # 从服务器导入数据 artemis_fgm_import = pyspedas.themis.fgm(trange=AtimeRange, probe='b', time_clip=True, varnames='thb_fgs_gsm') # 构建原始DataFrame df_fgm = pd.DataFrame({'Time': get_data('thb_fgs_gsm')[0], 'BX_GSM': get_data('thb_fgs_gsm')[1][:, 0], 'BY_GSM': get_data('thb_fgs_gsm')[1][:, 1], 'BZ_GSM': get_data('thb_fgs_gsm')[1][:, 2]}, columns=['Time', 'BX_GSM', 'BY_GSM', 'BZ_GSM']) df_fgm['Time'] = pd.to_datetime(df_fgm['Time'], unit='s') # 生成缺失的分钟级时间序列(取第一个数据点所在分钟的前一分钟作为结束) missing_time_range = pd.date_range(start=AtimeRange[0], end=df_fgm['Time'][0].floor('min'), freq='min') # 创建缺失数据的DataFrame,自动填充数值列为NaN missing_df = pd.DataFrame({'Time': missing_time_range}) for col in ['BX_GSM', 'BY_GSM', 'BZ_GSM']: missing_df[col] = np.nan # 拼接缺失数据与原始数据 combined_df = pd.concat([missing_df, df_fgm], ignore_index=True) # 设置时间列为索引,便于时间序列操作 combined_df = combined_df.set_index('Time') # 线性插值填充所有缺失值(包括原始数据中的分散NaN) interpolated_df = combined_df.interpolate(method='linear') # 降采样至1分钟间隔,这里采用均值统计,可根据需求替换为max/min等 resampled_df = interpolated_df.resample('min').mean().reset_index() # 输出前15行查看结果 print(resampled_df.head(15))
关键细节说明
- 生成缺失时间范围时,使用
floor('min')确保结束时间是第一个数据点所在分钟的前一分钟,避免重复时间戳。 - 循环添加数值列并设为NaN,保证拼接后的DataFrame列结构完全一致。
- 先插值再重采样,确保降采样的分钟级数据是基于完整插值后的高采样数据计算而来。
内容的提问来源于stack exchange,提问作者Kajmunso
相关产品推荐
相关产品推荐

