如何将不同时间步长的两个变量保存至同一CSV文件
问题修复:对齐不同步长的气象时间序列并写入同一CSV
原代码核心问题是RAD变量的循环逻辑错误,且未按时间戳对齐PBLH(114步,从000开始)和RAD(112步,从003开始)的序列,导致索引越界。以下是修复后的完整代码,关键通过时间映射实现两个变量的精准对齐:
import datetime import pandas as pd import os # 假设GFS、radiation、stations、hpbl等变量已正确加载 lat = GFS.variables['latitude'][:] lon = GFS.variables['longitude'][:] times_pblh = GFS['valid_time'][:] times_rad = radiation['valid_time'][:] unit = GFS['time'].units step = GFS['step'] for key, value in stations.iterrows(): station = value[0] file_name = f"{station}.csv" lon_point = value[1] lat_point = value[2] # 找到距离站点最近的经纬度索引 sq_diff_lat = (lat - lat_point)**2 sq_diff_lon = (lon - lon_point)**2 min_index_lat = sq_diff_lat.argmin() min_index_lon = sq_diff_lon.argmin() print(f"Generating time series for station {station}") ref_date = datetime.datetime(int(unit[14:18]), int(unit[19:21]), int(unit[22:24]), int(unit[25:27])) # 构建PBLH的时间-数据映射 pblh_dict = {} step_dict = {} for index, time in enumerate(times_pblh): date_time = ref_date + datetime.timedelta(seconds=int(time)) pblh_dict[date_time] = hpbl[index, min_index_lat, min_index_lon].values step_dict[date_time] = step[index].values # 构建RAD的时间-数据映射 rad_dict = {} for index, time in enumerate(times_rad): date_time = ref_date + datetime.timedelta(seconds=int(time)) rad_dict[date_time] = radiation[index, min_index_lat, min_index_lon].values # 以PBLH的完整时间序列为基准整理数据 date_range = list(pblh_dict.keys()) step_data = [step_dict[dt] for dt in date_range] pblh_data = [pblh_dict[dt] for dt in date_range] # 匹配RAD数据,无对应时间则填充NaN rad_data = [rad_dict.get(dt, float('nan')) for dt in date_range] # 构建DataFrame并写入CSV df = pd.DataFrame({ "Forecast (valid time)": step_data, "RAD (W m**-2)": rad_data, "PBLH (m)": pblh_data }, index=date_range) df.index.name = "Date-Time" print(f"Saving time series to {file_name}") df.to_csv(os.path.join(dir_out, file_name), sep=';', encoding="utf-8", index=True) print(f"\nSuccessfully saved all time series to output directory:\n{dir_out}")
关键改动说明
- 时间映射对齐:为两个变量分别创建时间戳到数据的字典,通过时间戳精准匹配,彻底避免索引硬编码导致的越界问题
- 基准序列选择:以PBLH的完整时间序列为基准,RAD无对应时间的位置自动填充
NaN,保证CSV时间序列的完整性 - 修复语法错误:移除原代码中语法失效的RAD循环语句,改用更清晰的字典映射逻辑
- 局部变量隔离:将
date_range等列表的初始化放到每个站点循环内,避免跨站点迭代时的数据污染
内容的提问来源于stack exchange,提问作者William Jacondino
相关产品推荐
相关产品推荐

