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

如何将含多列表的GPS卫星文本数据加载至Pandas DataFrame

解决GPS卫星数据展开为Pandas DataFrame的问题

你直接把文件路径字符串传给pd.DataFrame是错误用法,这也是报错ValueError: DataFrame constructor not properly called.的原因——DataFrame构造函数需要数组、字典这类数据结构,不是文件路径。要实现你的需求,需要先读取文件内容,再处理每行的特殊结构(前4个公共字段+多组卫星数据),将其展开为每行对应一条卫星数据的格式。

处理步骤与代码示例

假设你的文件每行格式为:id,time,steer,extclk,prn1msg1pseudoR1carrPh1A1CNR1B1C1prn2msg2pseudoR2carrPh2A2CNR2B2C2(前4个字段用逗号分隔,后续每组卫星的8个属性无分隔符连续拼接),可以按以下方式处理:

import pandas as pd

# ********** 请根据你的实际数据调整以下字段长度 **********
# 定义单颗卫星每个属性的字符长度
sat_field_lengths = {
    'prn': 3,    # 卫星编号长度
    'msg': 1,    # 消息类型长度
    'pseudoR': 10, # 伪距长度
    'carrPh': 10,  # 载波相位长度
    'A': 5,      # 字段A长度
    'CNR': 3,    # 载噪比长度
    'B': 5,      # 字段B长度
    'C': 5       # 字段C长度
}
sat_fields = list(sat_field_lengths.keys())
total_sat_length = sum(sat_field_lengths.values())  # 单颗卫星数据的总长度

data_rows = []
file_path = r'D:\projects\test-data.csv'

# 逐行读取并处理文件
with open(file_path, 'r', encoding='utf-8') as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        # 拆分前4个公共字段(maxsplit=4确保只拆分前4个逗号)
        split_parts = line.split(',', maxsplit=4)
        if len(split_parts) < 5:
            continue  # 跳过格式异常的行
        id_val, time_val, steer_val, extclk_val, sat_data_str = split_parts
        
        # 计算当前行包含的卫星数量
        num_satellites = len(sat_data_str) // total_sat_length
        # 拆分每颗卫星的数据块
        for idx in range(num_satellites):
            start_pos = idx * total_sat_length
            end_pos = start_pos + total_sat_length
            sat_chunk = sat_data_str[start_pos:end_pos]
            
            # 拆分当前卫星的各个属性
            sat_attrs = {}
            current_pos = 0
            for field, length in sat_field_lengths.items():
                sat_attrs[field] = sat_chunk[current_pos:current_pos+length].strip()
                current_pos += length
            
            # 合并公共字段与卫星属性,添加到数据列表
            data_rows.append({
                'id': id_val,
                'time': time_val,
                'steer': steer_val,
                'extclk': extclk_val,
                **sat_attrs
            })

# 转换为DataFrame
df = pd.DataFrame(data_rows)
# 可根据需要转换字段类型,比如把数值字段转为float/int
# df[['steer', 'pseudoR', 'carrPh', 'CNR']] = df[['steer', 'pseudoR', 'carrPh', 'CNR']].astype(float)
print(df.head())

关键说明

  1. 字段长度调整:必须根据你的实际数据修改sat_field_lengths中的长度值,否则会拆分错误。
  2. 分隔符适配:如果前4个公共字段的分隔符不是逗号,修改split(',', maxsplit=4)中的分隔符即可。
  3. 格式异常处理:代码中跳过了空行和格式不完整的行,你可以根据需求添加更详细的错误处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:44:52