Python实现两个Excel表时间戳匹配插值及代码问题排查
问题分析与解决方案
你的代码存在的问题
这段代码无法正常运行,核心原因如下:
- 列名不匹配:代码中用
Time和Concentration作为列名,但实际工作表的列是ScanTime和Pollutant_Concentration,会触发KeyError。 - 时间格式未处理:
interp1d仅支持数值类型输入,直接传入时间字符串或未转换的datetime对象会报错。 - 时间序列未排序:
interp1d要求输入的x轴(时间)必须单调递增,若原始数据时间顺序混乱,插值会失败。 - 粒度逻辑缺失:
GEMS_AOD_Boston是每日数据,Boston_Air_Us是小时级数据,直接插值未明确时间轴映射关系(比如每日数据对应当天0点还是日均值)。
正确实现步骤
要完成从每日数据插值到小时/分钟级并匹配目标表的操作,按以下步骤执行:
1. 加载数据并标准化时间格式
将两个表的ScanTime转换为pandas datetime类型,确保格式统一:
import pandas as pd from scipy.interpolate import interp1d # 加载数据 df_hourly = pd.read_excel('Boston_Air_Us.xlsx') df_daily = pd.read_excel('GEMS_AOD_Boston.xlsx') # 转换时间列为datetime类型 df_hourly['ScanTime'] = pd.to_datetime(df_hourly['ScanTime']) df_daily['ScanTime'] = pd.to_datetime(df_daily['ScanTime'])
2. 确保时间序列单调递增
对数据框按时间排序,避免插值错误:
df_hourly = df_hourly.sort_values('ScanTime').reset_index(drop=True) df_daily = df_daily.sort_values('ScanTime').reset_index(drop=True)
3. 将时间转换为数值型(时间戳)
把datetime对象转为Unix时间戳(单位:秒),适配interp1d的数值输入要求:
# 转换为时间戳(数值型) df_daily['timestamp'] = df_daily['ScanTime'].astype('int64') // 10**9 df_hourly['timestamp'] = df_hourly['ScanTime'].astype('int64') // 10**9
4. 执行插值并匹配目标时间点
假设每日数据对应当天起始时刻(如2024-05-01 00:00:00),用线性插值将每日浓度扩展到小时级时间点:
# 创建插值函数(线性插值,超出原始时间范围的点用外推) interp_func = interp1d( df_daily['timestamp'], df_daily['Pollutant_Concentration'], kind='linear', fill_value='extrapolate' # 可选,处理超出原始时间范围的点 ) # 对小时级数据的时间点执行插值 df_hourly['Interpolated_Concentration'] = interp_func(df_hourly['timestamp'])
5. 保存结果
# 移除临时timestamp列,保存结果 df_hourly.drop('timestamp', axis=1).to_excel('interpolated_data.xlsx', index=False)
分钟级匹配说明
如果Boston_Air_Us实际包含分钟级数据,上述代码同样适用——只需保证df_hourly['ScanTime']是分钟级datetime类型,插值函数会自动计算对应时间点的浓度值。
注意:从每日数据插值到分钟级属于低粒度到高粒度的上采样,线性插值是基础方式;若业务需要(如假设污染物浓度全天恒定),可改用常数插值(kind='previous'或kind='next')。
内容的提问来源于stack exchange,提问作者Redz
相关产品推荐
相关产品推荐

