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

从自定义生成数据的URL读取到Pandas DataFrame遇解析错误求助

问题:读取自定义NOAA时间序列URL数据到Pandas DataFrame失败

此前用类似代码读取NOAA固定数据URL可正常运行:

bst = pd.read_csv('https://psl.noaa.gov/data/correlation/censo.data', skiprows=1, 
skipfooter=2,index_col=[0], header=None,
             engine='python', # c engine doesn't have skipfooter
             delim_whitespace=True)

但读取自定义生成的时间序列URL时失败:

zwnd = pd.read_csv('https://psl.noaa.gov/cgi-bin/data/timeseries/timeseries.pl?ntype=1&var=Zonal+Wind&level=1000&lat1=50&lat2=25&lon1=-135&lon2=-65&iseas=0&mon1=0&mon2=0&iarea=0&typeout=1&Submit=Create+Timeseries', skiprows=1, skipfooter=2,index_col=[0], header=None,
                 engine='python', # c engine doesn't have skipfooter
                 delim_whitespace=True)

完整报错信息:

pd.read_csv('https://psl.noaa.gov/cgi-bin/data/timeseries/timeseries.pl?ntype=1&var=Zonal+Wind&level=1000&lat1=50&lat2=25&lon1=-135&lon2=-65&iseas=0&mon1=0&mon2=0&iarea=0&typeout=1&Submit=Create+Timeseries', skiprows=1, skipfooter=2,index_col=[0], header=None,
                 engine='python', # c engine doesn't have skipfooter
                 delim_whitespace=True)
Traceback (most recent call last):

  Cell In[240], line 1
    pd.read_csv('https://psl.noaa.gov/cgi-bin/data/timeseries/timeseries.pl?ntype=1&var=Zonal+Wind&level=1000&lat1=50&lat2=25&lon1=-135&lon2=-65&iseas=0&mon1=0&mon2=0&iarea=0&typeout=1&Submit=Create+Timeseries', skiprows=1, skipfooter=2,index_col=[0], header=None,

  File ~\Anaconda3\envs\Stats\lib\site-packages\pandas\util\_decorators.py:211 in wrapper
    return func(*args, **kwargs)

  File ~\Anaconda3\envs\Stats\lib\site-packages\pandas\util\_decorators.py:331 in wrapper
    return func(*args, **kwargs)

  File ~\Anaconda3\envs\Stats\lib\site-packages\pandas\io\parsers\readers.py:950 in read_csv
    return _read(filepath_or_buffer, kwds)

  File ~\Anaconda3\envs\Stats\lib\site-packages\pandas\io\parsers\readers.py:611 in _read
    return parser.read(nrows)

  File ~\Anaconda3\envs\Stats\lib\site-packages\pandas\io\parsers\readers.py:1778 in read
    ) = self._engine.read(  # type: ignore[attr-defined]

  File ~\Anaconda3\envs\Stats\lib\site-packages\pandas\io\parsers\python_parser.py:282 in read
    alldata = self._rows_to_cols(content)

  File ~\Anaconda3\envs\Stats\lib\site-packages\pandas\io\parsers\python_parser.py:1045 in _rows_to_cols
    self._alert_malformed(msg, row_num + 1)

  File ~\Anaconda3\envs\Stats\lib\site-packages\pandas\io\parsers\python_parser.py:765 in _alert_malformed
    raise ParserError(msg)

ParserError: Expected 2 fields in line 133, saw 3. Error could possibly be due to quotes being ignored when a multi-char delimiter is used.

解决方法

1. 先排查异常行原因

直接访问目标URL,查看第133行内容,通常是该行存在额外空格、注释或格式异常,导致按空格拆分后字段数不符。

2. 调整读取参数

方案一:跳过错误行

临时跳过格式异常的行,优先加载正常数据:

zwnd = pd.read_csv(
    'https://psl.noaa.gov/cgi-bin/data/timeseries/timeseries.pl?ntype=1&var=Zonal+Wind&level=1000&lat1=50&lat2=25&lon1=-135&lon2=-65&iseas=0&mon1=0&mon2=0&iarea=0&typeout=1&Submit=Create+Timeseries',
    skiprows=1,
    skipfooter=2,
    index_col=[0],
    header=None,
    engine='python',
    delim_whitespace=True,
    on_bad_lines='skip'
)

方案二:手动预处理数据

先获取原始文本,清理异常行后再加载,确保数据完整性:

import requests
import pandas as pd
from io import StringIO

url = 'https://psl.noaa.gov/cgi-bin/data/timeseries/timeseries.pl?ntype=1&var=Zonal+Wind&level=1000&lat1=50&lat2=25&lon1=-135&lon2=-65&iseas=0&mon1=0&mon2=0&iarea=0&typeout=1&Submit=Create+Timeseries'
response = requests.get(url)
lines = response.text.splitlines()

# 跳过开头1行、结尾2行,过滤字段数不为2的行
cleaned_lines = []
for line in lines[1:-2]:
    parts = line.strip().split()
    if len(parts) == 2:
        cleaned_lines.append('\t'.join(parts))

# 从清理后的文本加载DataFrame
zwnd = pd.read_csv(StringIO('\n'.join(cleaned_lines)), sep='\t', index_col=0, header=None)

方案三:优化分隔符与注释处理

如果异常行是注释,可通过指定注释符号跳过;同时用sep='\s+'替代delim_whitespace=True,提升分隔稳定性:

zwnd = pd.read_csv(
    url,
    skiprows=1,
    skipfooter=2,
    index_col=[0],
    header=None,
    engine='python',
    sep='\s+',
    comment='#'
)

3. 验证数据

加载完成后,用zwnd.head()、zwnd.tail()检查数据格式是否正常,确认关键信息未丢失。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:21:03