【发布时间】:2021-03-26 18:08:37
【问题描述】:
对不起,标题太长了,我在这个逻辑上有点挣扎
我有通过 NOAA 网站的代码,并从他们的学位日目录和子目录建立链接,以建立到他们所有文本文件的链接(我相信这不是最好的方法,所以我不会被冒犯如果有人告诉我这可能会更好):
from bs4 import BeautifulSoup as bs
import requests
import re
topdir = 'https://ftp.cpc.ncep.noaa.gov/htdocs/products/analysis_monitoring/cdus/degree_days/archives/Heating%20degree%20Days/weekly%20states/'
res = requests.get(topdir)
soup = bs(res.text,'html.parser')
toplinks = []
midlinks = []
csvlinks = []
for link in soup.find_all('a'):
if re.search(r"^2\d{3}\/$", str(link.get('href'))):
toplinks.append(link.get('href'))
for link in toplinks:
midlink = topdir+str(link)
midlinks.append(midlink)
for mlink in midlinks:
mid = requests.get(mlink)
msoup = bs(mid.text,'html.parser')
for link in msoup.find_all('a'):
if re.search(r"^[a-zA-Z]{3}%\d{4},%\d{6}\.txt$",str(link.get('href'))):
csvlinks.append(mlink+str(link.get('href')))
链接的格式实际上是这样的:https://ftp.cpc.ncep.noaa.gov/htdocs/products/analysis_monitoring/cdus/degree_days/archives/Heating%20degree%20Days/weekly%20states/2021/Mar%2020,%202021.txt
如您所见,链接的末尾表示月、年,然后表示日和年作为一个数字。
每个文件的 csv 格式如下:
HEATING DEGREE DAY DATA WEEKLY SUMMARY
POPULATION-WEIGHTED STATE,REGIONAL,AND NATIONAL AVERAGES
CLIMATE PREDICTION CENTER-NCEP-NWS-NOAA
LAST DATE OF DATA COLLECTION PERIOD IS MAR 20, 2021
ACCUMULATIONS ARE FROM JUL 1, 2020 TO MAR 20, 2021
-999 = NORMAL LESS THAN 100 OR RATIO INCALCULABLE
STATE WEEK WEEK WEEK CUM CUM CUM CUM CUM
TOTAL DEV DEV TOTAL DEV DEV DEV DEV
FROM FROM FROM FROM FROM FROM
NORM L YR NORM L YR NORM L YR
PRCT PRCT
ALABAMA 39 -37 21 2147 -401 235 -16 12
ALASKA 356 62 68 8372 -552 313 -6 4
ARIZONA 83 22 4 1853 -43 70 -2 4
ARKANSAS 67 -29 -19 3077 -70 282 -2 10
CALIFORNIA 117 36 -6 1944 -126 52 -6 3
COLORADO 222 18 34 5473 -427 15 -7 0
... ... .. .. .... ... ... .. .
WEST VIRGINIA 135 -20 6 4157 -300 337 -7 9
WISCONSIN 205 -23 -8 6092 -355 154 -6 3
WYOMING 232 9 -2 6219 -406 -193 -6 -3
REGION
NEW ENGLAND 230 26 51 4903 -490 55 -9 1
MIDDLE ATLANTIC 199 14 50 4418 -484 147 -10 3
E N CENTRAL 181 -12 5 5082 -351 252 -6 5
W N CENTRAL 170 -21 -23 5473 -286 86 -5 2
SOUTH ATLANTIC 77 -6 30 2226 -272 213 -11 11
E S CENTRAL 63 -37 2 2908 -266 269 -8 10
W S CENTRAL 47 -11 21 2015 -89 240 -4 14
MOUNTAIN 153 11 4 4040 -225 4 -5 0
PACIFIC 127 33 -8 2406 -129 17 -5 1
UNITED STATES 134 2 16 3518 -282 156 -7 5
GAS HOME HEATING CUSTOMER WEIGHTED
REGION
NEW ENGLAND 224 26 52 4737 -468 72 -9 2
MIDDLE ATLANTIC 198 14 50 4406 -476 150 -10 4
E N CENTRAL 182 -11 5 5086 -352 251 -6 5
W N CENTRAL 171 -21 -22 5483 -280 93 -5 2
SOUTH ATLANTIC 102 -5 37 2866 -316 240 -10 9
E S CENTRAL 65 -37 1 2944 -269 270 -8 10
W S CENTRAL 49 -12 19 2104 -79 248 -4 13
MOUNTAIN 165 10 7 4396 -260 -4 -6 0
PACIFIC 123 34 -7 2221 -127 31 -5 1
我要检索的每个内容是列标题和第一个“区域”部分(实际上我只需要 WEEK TOTAL 列:
REGION
NEW ENGLAND 230 26 51 4903 -490 55 -9 1
MIDDLE ATLANTIC 199 14 50 4418 -484 147 -10 3
E N CENTRAL 181 -12 5 5082 -351 252 -6 5
W N CENTRAL 170 -21 -23 5473 -286 86 -5 2
SOUTH ATLANTIC 77 -6 30 2226 -272 213 -11 11
E S CENTRAL 63 -37 2 2908 -266 269 -8 10
W S CENTRAL 47 -11 21 2015 -89 240 -4 14
MOUNTAIN 153 11 4 4040 -225 4 -5 0
PACIFIC 127 33 -8 2406 -129 17 -5 1
我认为最有意义的是让文本文件的日期成为行标识符,将区域作为列标题,并以这种方式不断附加数据框,以便可以按日期对其进行排序。
我正在努力:
- 这样做的逻辑和
- pd.read_csv 和确定编码
【问题讨论】:
-
这是一个不错的数据文件,但它不是 csv 文件。我什至不会尝试在这里使用 read_csv,而是直接使用自定义解析器
-
@SergeBallesta 感谢您的意见!我对这些不是很有经验,那会是什么样的?
标签: python pandas dataframe csv