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

如何用Pandas/Numpy按日期读取带#时间戳的观测文本?

气象观测数据按日期分组解决方案

核心思路

逐行读取文件,识别以#开头的日期标记行作为分组节点,收集该节点后续的观测数据直到下一个日期标记,将每组数据转为指定列名的DataFrame,同时记录对应的日期戳。

实现代码

import pandas as pd

# 定义观测数据的列名
COLUMNS = ['LVLpTYP', 'ETIME', 'PRESSURE','GPH','TEMP','RH','DPDP','WDIR','WSPD']

time_stamps = []
data_frames = []
current_day_data = []

# 读取文件并分组处理
with open('INM00043333-data.txt', 'r') as file:
    for line in file:
        stripped_line = line.strip()
        # 跳过空行
        if not stripped_line:
            continue
        
        if stripped_line.startswith('#'):
            # 若当前已有未保存的当日数据,先转为DataFrame存入列表
            if current_day_data:
                df = pd.DataFrame(current_day_data, columns=COLUMNS)
                # 将数值型列转换为对应数据类型(处理非数值的异常值)
                numeric_columns = ['PRESSURE','GPH','TEMP','RH','DPDP','WDIR','WSPD']
                df[numeric_columns] = df[numeric_columns].apply(pd.to_numeric, errors='coerce')
                data_frames.append(df)
                current_day_data = []
            
            # 提取#后的时间戳(假设格式为# YYYY-MM-DD HH:MM:SS)
            timestamp = stripped_line.split(maxsplit=1)[1]
            time_stamps.append(timestamp)
        else:
            # 拆分观测数据行,确保列数匹配后加入当日数据列表
            row_data = stripped_line.split()
            if len(row_data) == len(COLUMNS):
                current_day_data.append(row_data)
    
    # 处理文件末尾最后一组未保存的数据
    if current_day_data:
        df = pd.DataFrame(current_day_data, columns=COLUMNS)
        numeric_columns = ['PRESSURE','GPH','TEMP','RH','DPDP','WDIR','WSPD']
        df[numeric_columns] = df[numeric_columns].apply(pd.to_numeric, errors='coerce')
        data_frames.append(df)

# 可选:创建日期到DataFrame的映射字典,方便直接按日期调取数据
date_data_map = dict(zip(time_stamps, data_frames))

使用说明

  1. time_stamps数组存储所有日期标记行的时间戳,与data_frames列表中的DataFrame一一对应
  2. 可通过索引直接访问对应日期的数据:data_frames[0]对应time_stamps[0]的观测数据
  3. 若需要按日期字符串快速调取,使用date_data_map字典,例如:date_data_map['2023-10-01 00:00:00']

原方法问题分析

你之前的代码只是将每行文本转为numpy数组,但没有区分日期标记行和观测数据行,也没有实现分组逻辑,因此无法将数据按日期归类。

内容的提问来源于stack exchange,提问作者The Emerging Star

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:35:27