无需本地存储读取网页数据至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
相关产品推荐
相关产品推荐

