You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将不同时间步长的两个变量保存至同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:41:33