如何用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))
使用说明
time_stamps数组存储所有日期标记行的时间戳,与data_frames列表中的DataFrame一一对应- 可通过索引直接访问对应日期的数据:
data_frames[0]对应time_stamps[0]的观测数据 - 若需要按日期字符串快速调取,使用
date_data_map字典,例如:date_data_map['2023-10-01 00:00:00']
原方法问题分析
你之前的代码只是将每行文本转为numpy数组,但没有区分日期标记行和观测数据行,也没有实现分组逻辑,因此无法将数据按日期归类。
内容的提问来源于stack exchange,提问作者The Emerging Star
相关产品推荐
相关产品推荐

