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

Python:将含多表头的NOAA飓风CSV合并为单个DataFrame

处理NOAA飓风CSV数据:移除子表头并合并为单个DataFrame

我之前处理过NOAA的这种飓风数据集,这种每个飓风条目自带独立表头的格式确实有点反直觉,不过用Python结合pandas和csv模块就能轻松搞定。下面是具体的解决思路和可运行代码:

核心思路

这种数据的特点是:

  • 每段飓风数据以表头行开头(比如AL092011, IRENE, 3, ),包含飓风编号、名称、等级等元信息
  • 表头行之后是该飓风的逐小时/逐时段观测数据行(比如20110821, 0000, , TS, 15.0N, 59.0W,...)

我们需要做的是:

  1. 逐行读取文件,识别表头行和数据行
  2. 保存当前飓风的元信息,遇到数据行就把元信息追加到数据行前面
  3. 把所有合并后的行收集起来,最终转为DataFrame

完整代码实现

import pandas as pd
import csv

# 替换成你的NOAA飓风CSV文件路径
file_path = "hurricane_data.csv"

merged_records = []
current_hurricane_meta = None

# 逐行解析CSV
with open(file_path, 'r', encoding='utf-8') as f:
    csv_reader = csv.reader(f)
    for raw_row in csv_reader:
        # 过滤完全空的行
        cleaned_row = [cell.strip() for cell in raw_row if cell.strip() != '']
        if not cleaned_row:
            continue
        
        # 判断是否为飓风表头行:NOAA大西洋飓风编号以AL开头,格式为AL+两位数字+四位年份(比如AL092011)
        if cleaned_row[0].startswith('AL') and len(cleaned_row[0]) == 6:
            # 提取需要保留的元信息:编号、名称(根据你的示例,前两个字段)
            current_hurricane_meta = [cleaned_row[0], cleaned_row[1]]
        else:
            # 数据行:合并元信息和当前数据行
            if current_hurricane_meta is not None:
                merged_row = current_hurricane_meta + cleaned_row
                merged_records.append(merged_row)

# 定义合并后的列名(根据NOAA数据集的字段调整,这里匹配你的示例格式)
column_names = [
    "Hurricane ID", "Hurricane Name", "Date", "Time", "Placeholder", "Storm Status",
    "Latitude", "Longitude", "Max Wind (kt)", "Min Pressure (mb)", 
    "Wind Radius NE (34kt)", "Wind Radius SE (34kt)", "Wind Radius SW (34kt)", "Wind Radius NW (34kt)",
    "Wind Radius NE (50kt)", "Wind Radius SE (50kt)", "Wind Radius SW (50kt)", "Wind Radius NW (50kt)",
    "Wind Radius NE (64kt)", "Wind Radius SE (64kt)", "Wind Radius SW (64kt)", "Wind Radius NW (64kt)"
]

# 转换为DataFrame
hurricane_df = pd.DataFrame(merged_records, columns=column_names)

# 可选:保存清理后的数据集
hurricane_df.to_csv("cleaned_hurricane_data.csv", index=False, encoding='utf-8')

# 查看前5行验证结果
print(hurricane_df.head())

关键细节说明

  • 表头行识别:我用了startswith('AL')和长度判断,如果你处理的是东太平洋飓风(编号以EP开头),可以改成cleaned_row[0].startswith(('AL', 'EP'))
  • 空行处理:过滤完全空的行,避免解析错误
  • 列名定义:NOAA的飓风数据集字段是固定的,你可以根据官方文档调整列名,确保和数据字段一一对应
  • 编码问题:如果读取文件时出现编码错误,可以尝试修改encoding参数为'latin-1'(NOAA老数据集常用编码)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:05:41