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

修改Python脚本实现多站点气象数据正确追加至目标文件

气象站数据追加脚本修复需求

我有一个包含7个气象站数据的文本文件,每行以YYYYDOY格式日期开头(比如2022001代表2022年1月1日),后面跟着7个站点的无空格数值(数值是三位前置零填充的小数,例如001.0002.5表示两个站点值分别为1.0和2.5),需要给这个文件追加新数据。

我尝试从多个制表符分隔的新文本文件读取数据,每个文件对应一个站点(首列是年、日,后面跟着3个数据变量),转换为现有文件兼容的格式后追加。现有脚本能完成部分操作,但存在问题:单个站点的新数据被重复写入所有7个站点的位置,需要实现7个站点数据的正确导入。


原脚本问题分析

原脚本的核心缺陷:

  • 仅读取单个站点的新数据文件,却通过循环将该站点的weather值重复拼接7次,导致所有站点位置都是同一数据
  • 缺少多站点数据按日期聚合的逻辑,无法将不同站点的同日期数据对应到一行的对应位置

修复后的脚本代码

import os
from collections import defaultdict

year0 = 2023  # 新数据起始年份
nWeatherStationsT = 7
nWeatherStationsP = 7

def makeSwatInput(txtOldData, txtNewDataList, txtfout, TorP):
    if TorP == 'T':
        nWeatherStations = nWeatherStationsT
    else:
        nWeatherStations = nWeatherStationsP
    
    # 读取原有气象数据
    with open(txtOldData, 'r') as fin:
        dataOld = fin.readlines()
    
    # 按日期聚合所有站点数据:键为YYYYDOY日期,值为对应7个站点的数据列表
    station_data = defaultdict(lambda: ['-99.0'] * nWeatherStations)
    
    # 遍历每个站点的新数据文件
    for station_idx, txtNewData in enumerate(txtNewDataList):
        if station_idx >= nWeatherStations:
            break  # 超出设定站点数则跳过
        
        with open(txtNewData, 'r') as fin:
            dataNew = fin.readlines()
        
        # 处理当前站点的每一行数据
        for row in dataNew:
            line = row.strip().split()
            if not line:
                continue
            year = int(line[0])
            day = int(line[1])
            date_key = f"{year0 + year - 1:04d}{day:03d}"
            
            if TorP == 'T':
                # 处理温度数据:拼接最低温+最高温
                temp_high = float(line[2])
                temp_low = float(line[3])
                if temp_high > -99 and temp_low > -99:
                    val = f"{temp_low:.1f}".zfill(5) + f"{temp_high:.1f}".zfill(5)
                else:
                    val = '-99.0-99.0'
            elif TorP == 'P':
                # 处理降水数据
                precip = float(line[4])
                val = f"{precip:.1f}".zfill(5) if precip > -99 else '-99.0'
            else:
                print("错误:TorP参数仅支持'T'或'P'")
                return
            
            station_data[date_key][station_idx] = val
    
    # 将聚合后的新数据追加到原有数据
    for date_key in sorted(station_data.keys()):
        lineOut = date_key
        for station_val in station_data[date_key]:
            lineOut += station_val
        dataOld.append(lineOut + '\n')
    
    # 写入最终文件
    with open(txtfout, 'w') as fout:
        fout.writelines(dataOld)

# 使用示例:传入7个站点的新数据文件路径列表
# makeSwatInput("old_data.txt", ["station1.txt", "station2.txt", ..., "station7.txt"], "output.txt", "T")

代码关键改进点

  • 支持多站点文件批量读取:通过传入站点文件列表,逐个处理每个站点的数据
  • 按日期聚合数据:用defaultdict将同日期的不同站点数据对应到正确位置,避免重复写入
  • 优化文件操作:使用with语句自动管理文件资源,避免泄漏
  • 增加鲁棒性:跳过空行、新增参数合法性检查,处理异常数值场景

内容的提问来源于stack exchange,提问作者GGKK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:12:48