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

无需本地存储读取网页数据至DataFrame,求更高效实现方法

问题描述

我需要将指定链接中的数据读取至DataFrame且无需本地存储(这一点至关重要)。我已实现一种方法如下,请问是否存在更高效的实现方式?

原实现代码:

from urllib.request import urlopen
import pandas as pd
from io import StringIO
from matplotlib.dates import DateFormatter
from datetime import datetime


uri = 'https://mesonet.agron.iastate.edu/cgi-bin/request/asos.py?station=AXA&data=all&year1=2022&month1=12&day1=1&year2=2022&month2=12&day2=1&tz=Etc%2FUTC&format=onlycomma&latlon=no&elev=no&missing=M&trace=T&direct=no&report_type=3&report_type=4'
data = urlopen(uri, timeout=300).read().decode("utf-8")

dateparse = lambda x: datetime.strptime(x.strip(), '%Y-%m-%d %H:%M')


str1 = data.split('\n')
dfList = []
for ii in range(1,len(str1)):
    if len(str1[ii])>0:
        df1 = pd.read_csv(StringIO(str1[ii]), parse_dates=[1], date_parser=dateparse, header=None) #Read each string into a dataframe
        if not df1.empty:
            df2 = df1.iloc[:,0:3] #Get the first five columns
            if df2.iloc[0,-1] != 'M': #Don't append the ones with missing data
                dfList.append(df2)
df = pd.concat(dfList, axis=0, ignore_index=True)
df.columns = ['Station','Date','Temp']

ax1 = df.plot(x=1,y=2)
ax1.get_figure().autofmt_xdate()
更高效的实现方式

你当前逐行处理并拼接小DataFrame的方式存在不必要的开销,尤其数据量较大时效率会明显下降。可以直接利用pandas.read_csv的原生能力完成一站式处理,代码更简洁且效率更高:

import pandas as pd
from datetime import datetime

uri = 'https://mesonet.agron.iastate.edu/cgi-bin/request/asos.py?station=AXA&data=all&year1=2022&month1=12&day1=1&year2=2022&month2=12&day2=1&tz=Etc%2FUTC&format=onlycomma&latlon=no&elev=no&missing=M&trace=T&direct=no&report_type=3&report_type=4'

# 定义日期解析逻辑
dateparse = lambda x: datetime.strptime(x.strip(), '%Y-%m-%d %H:%M')

# 直接从URL读取数据,同时完成列筛选、日期解析、缺失值处理
df = pd.read_csv(
    uri,
    header=None,
    usecols=[0, 1, 2],  # 仅加载需要的前三列,减少内存占用
    parse_dates=[1],
    date_parser=dateparse,
    skip_blank_lines=True,
    na_values='M'  # 将标记为"M"的缺失值转为pandas可识别的NaN
).dropna(subset=[2])  # 过滤温度列存在缺失的行

# 设置列名
df.columns = ['Station', 'Date', 'Temp']

# 绘图
ax1 = df.plot(x='Date', y='Temp')
ax1.get_figure().autofmt_xdate()

核心优化点:

  • 直接读取URL:pandas.read_csv支持直接传入URL,省去手动发起请求、解码字符串的中间步骤
  • 按需加载列:通过usecols参数精准指定需要的列,避免加载无关数据
  • 批量处理缺失值:用na_values统一转换缺失标记,再通过dropna一次性过滤无效行,替代逐行判断的循环
  • 减少对象开销:避免循环创建大量小DataFrame再拼接的操作,降低内存占用和运算耗时

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:35:17