목차
1. 데이터 수집
웹사이트 링크 요청
유용한 정보 추출
csv 파일 저장
2. 온도 변화 곡선 그래프
matplotlib의 plt.plot() 메서드를 사용하여 하루 24시간 동안의 온도 변화 곡선을 그리고, plt.text() 메서드를 사용하여 최고 온도와 최저 온도를 지적하고 평균을 그립니다. 온도 선. 아래 그림은 온도 변화 곡선 그래프를 보여줍니다. (코드는 부록을 참조하세요)
matplotlib의 plt.plot() 메소드를 사용하여 하루 24시간의 습도 변화 곡선을 그리고, 평균 상대습도 선을 그리면 다음 그림이 습도 변화 곡선입니다. (코드는 부록 참조)
앞의 두 그림의 분석을 통해 온도와 습도 사이에 관계가 있음을 알 수 있습니다. 이 관계를 보다 명확하고 직관적으로 느끼려면 plt.scatter()를 사용하십시오. 온도를 가로좌표, 세로좌표를 습도로 나누는 방식으로 그래프에 각 순간의 점을 그려서 상관계수를 계산하면 다음과 같습니다.
대기질 지수 막대형 차트
풍향 및 풍속 레이더 차트
다음 14일 동안의 고온 및 저온 변화 곡선 차트
다음 14일 동안의 풍향 및 풍속 레이더 차트
다음 14일 동안의 기후 분포 파이 차트
3. 결론
4、代码框架
附源代码
백엔드 개발 파이썬 튜토리얼 Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

Apr 26, 2023 pm 03:19 PM
python

1. 데이터 수집

웹사이트 링크 요청

여기에서 지역 날씨 웹사이트를 방문하세요. 다른 지역을 크롤링하려면 마지막 101280701 지역 번호를 수정하세요. 7일 웹페이지이며, Weather1d는 현재 날짜를 나타내고, Weather15d는 다음 14일을 나타냅니다. 여기서는 주로 7일 및 14일 중국 기상 네트워크를 방문합니다. request.get() 메소드를 사용하여 웹페이지를 요청하면, 접속에 성공하면 웹페이지의 모든 문자열 텍스트를 얻게 됩니다. 요청하는 과정입니다.

def getHTMLtext(url):
"""请求获得网页内容"""
 try:
r = requests.get(url, timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
print("成功访问")
return r.text
 except:
print("访问错误")
 return" "
로그인 후 복사
유용한 정보 추출

여기서 BeautifulSoup 라이브러리를 사용하여 방금 얻은 문자열에서 데이터를 추출합니다. 먼저 웹 페이지를 확인하고 데이터를 얻는 데 필요한 태그를 찾습니다.

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

7일을 찾을 수 있습니다. div 태그의 데이터 정보와 id="7d", 날짜, 날씨, 온도, 풍도 및 기타 정보는 모두 ul 및 li 태그에 있으므로 BeautifulSoup을 사용하여 얻은 웹 페이지 텍스트 div 태그 ID를 검색할 수 있습니다. ="7d"라고 검색하고 ul, li 태그가 모두 포함되어 있는지 찾아 태그에서 해당 데이터 값을 추출하여 해당 목록에 저장합니다.

여기서 주의할 점은 날짜의 온도가 가장 높지 않은 경우도 있고, 데이터가 없는 상황은 판단하고 처리해야 한다는 점입니다. 또한 온도 뒤에 있는 섭씨 기호, 날짜 숫자 추출, 바람 수준 텍스트 추출 등 일부 데이터 저장 형식을 미리 처리해야 합니다. 이를 위해서는 문자 검색 및 문자열 분할 처리가 필요합니다.

def get_content(html):
"""处理得到有用信息保存数据文件"""
final = []# 初始化一个列表保存数据
bs = BeautifulSoup(html, "html.parser")# 创建BeautifulSoup对象
body = bs.body
data = body.find('div', {'id': '7d'})# 找到div标签且id = 7d
로그인 후 복사

다음은 오늘의 데이터를 크롤링합니다

data2 = body.find_all('div',{'class':'left-div'})
text = data2[2].find('script').string
text = text[text.index('=')+1 :-2] # 移除改var data=将其变为json数据
jd = json.loads(text)
dayone = jd['od']['od2'] # 找到当天的数据
final_day = [] # 存放当天的数据
count = 0
for i in dayone:
temp = []
if count <=23:
temp.append(i[&#39;od21&#39;]) # 添加时间
temp.append(i[&#39;od22&#39;]) # 添加当前时刻温度
temp.append(i[&#39;od24&#39;]) # 添加当前时刻风力方向
temp.append(i[&#39;od25&#39;]) # 添加当前时刻风级
temp.append(i[&#39;od26&#39;]) # 添加当前时刻降水量
temp.append(i[&#39;od27&#39;]) # 添加当前时刻相对湿度
temp.append(i[&#39;od28&#39;]) # 添加当前时刻控制质量
#print(temp)
final_day.append(temp)
count = count +1
로그인 후 복사

다음은 7일 동안의 데이터를 크롤링합니다

ul = data.find(&#39;ul&#39;)# 找到所有的ul标签
li = ul.find_all(&#39;li&#39;)# 找到左右的li标签
i = 0 # 控制爬取的天数
for day in li:# 遍历找到的每一个li
if i < 7 and i > 0:
temp = []# 临时存放每天的数据
date = day.find(&#39;h2&#39;).string # 得到日期
date = date[0:date.index(&#39;日&#39;)] # 取出日期号
temp.append(date)
inf = day.find_all(&#39;p&#39;)# 找出li下面的p标签,提取第一个p标签的值,即天气
temp.append(inf[0].string)
 tem_low = inf[1].find(&#39;i&#39;).string # 找到最低气温
 if inf[1].find(&#39;span&#39;) is None: # 天气预报可能没有最高气温
 tem_high = None
 else:
 tem_high = inf[1].find(&#39;span&#39;).string# 找到最高气温
 temp.append(tem_low[:-1])
 if tem_high[-1] == &#39;℃&#39;:
temp.append(tem_high[:-1])
 else:
temp.append(tem_high)
 wind = inf[2].find_all(&#39;span&#39;)# 找到风向
 for j in wind:
temp.append(j[&#39;title&#39;])
 wind_scale = inf[2].find(&#39;i&#39;).string # 找到风级
 index1 = wind_scale.index(&#39;级&#39;)
 temp.append(int(wind_scale[index1-1:index1]))
 final.append(temp)
i = i + 1
return final_day,final
로그인 후 복사

/weather15d에도 동일한 프로세스가 수행됩니다. 여기를 확인해보니 15일 동안의 정보가 있는 것으로 나타났습니다. 8~14일만, 처음 1~7일은 /weather에 있습니다. 여기서는 각각 두 개의 웹 페이지를 방문하고 크롤링된 데이터를 병합하여 마지막 14일의 데이터를 얻습니다. - 앞선 것은 앞으로 14일간의 데이터 크롤링 과정인데, 오늘의 24시간 기상정보 데이터에 대해서는 검색 결과 json 데이터임을 알 수 있습니다. .loads() 메서드를 사용하여 그날의 날씨 정보를 추출합니다.

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

csv 파일 저장

앞서 목록에 크롤링된 데이터를 추가하고, 여기에 csv 라이브러리를 도입하고, f_csv.writerow(header) 및 f_csv.writerows(data) 메서드를 사용하여 헤더와 각 행을 각각 씁니다. 1일과 향후 14일의 데이터는 각각 Weather1.csv와 Weather14.csv로 저장됩니다. 그들이 저장한 테이블은 다음과 같습니다.

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

2. 온도 변화 곡선 그래프

matplotlib의 plt.plot() 메서드를 사용하여 하루 24시간 동안의 온도 변화 곡선을 그리고, plt.text() 메서드를 사용하여 최고 온도와 최저 온도를 지적하고 평균을 그립니다. 온도 선. 아래 그림은 온도 변화 곡선 그래프를 보여줍니다. (코드는 부록을 참조하세요)

멋져요! 개인 작업에 꼭 필요한 N 오픈소스 프로젝트! 서둘러 모아보세요

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?분석 결과 이날 최고기온은 33℃, 최저기온은 28℃, 평균기온은 20.4℃ 안팎인 것으로 분석됐다. 낮과 밤의 차이는 5℃로 이른 아침에는 저온이 분포하고 정오부터 오후에는 고온이 분포합니다.

오늘의 상대습도 변화 곡선

matplotlib의 plt.plot() 메소드를 사용하여 하루 24시간의 습도 변화 곡선을 그리고, 평균 상대습도 선을 그리면 다음 그림이 습도 변화 곡선입니다. (코드는 부록 참조)

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?분석 결과 이날 최고 상대습도는 86%, 최저 상대습도는 58℃, 평균 상대습도는 75% 내외인 것으로 확인됐다. 이른 아침에는 습도가 상대적으로 높고, 오후부터 황혼까지는 습도가 상대적으로 높습니다.

온도와 습도 상관 분석 차트

앞의 두 그림의 분석을 통해 온도와 습도 사이에 관계가 있음을 알 수 있습니다. 이 관계를 보다 명확하고 직관적으로 느끼려면 plt.scatter()를 사용하십시오. 온도를 가로좌표, 세로좌표를 습도로 나누는 방식으로 그래프에 각 순간의 점을 그려서 상관계수를 계산하면 다음과 같습니다.

분석에 따르면 하루의 온도와 습도 사이에는 음의 상관관계가 있으며, 이는 시간과 음의 상관관계가 있음을 의미합니다. 또한, 추가 분석에 따르면 온도가 낮을수록 수분이 더 많은 것으로 나타났습니다. 기온이 높으면 물이 증발하고 공기는 더 건조해지고 습도는 낮아집니다. 이는 정상적인 기후 현상과 일치합니다.

대기질 지수 막대형 차트

대기질 지수 AQI는 대기질 상태를 정량적으로 나타내는 지수로, 값이 클수록 대기오염이 심하고 인체 건강에 미치는 해로움이 커집니다. 공기질 지수는 일반적으로 6단계로 구분되며, 수준이 높을수록 오염도가 심각한 것을 의미합니다. 다음은 plt.bar 방식을 사용하여 하루 24시간 동안의 공기질을 히스토그램으로 나타낸 것입니다. , 해당 히스토그램 색상도 밝은 부분에서 어두운 부분으로 변하며 이는 오염도가 점차 증가하고 있음을 나타내므로 오염 상황을보다 직관적으로 표시하며 최고 및 최저 대기 질 지수도 표시되며 평균 대기 질 지수는 다음과 같습니다. 아래 그림은 그 결과입니다. :

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

위는 남부 주하이의 대기 질 지수가 가장 높은 범위에 있음을 알 수 있습니다. 분석 결과 이날 공기질 지수가 가장 높은 것은 35에 달했고, 가장 낮은 것은 14에 불과했고 평균은 25 정도였다. 시간별로도 알 수 있다. 공기는 기본적으로 이른 아침(4~9시)에 가장 좋고, 대기 오염이 가장 심각한 오후에는 오염이 최소화되는 이른 아침에 밖에 나가서 신선한 공기를 마실 수 있습니다.

아래 대기질 지도는 북부 도시의 대기질 지도입니다. 이곳의 환경은 주하이에 비해 훨씬 열등하다는 것을 알 수 있습니다.

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

풍향 및 풍속 레이더 차트

하루 동안의 풍력 및 풍향 통계 풍력 및 풍향은 극좌표를 사용하여 표시하는 것이 더 좋으므로 극좌표 방식을 사용하여 풍력을 표시합니다. 그리고 하루 동안의 풍향 차트를 원으로 나누어 8부분으로 나누어 각 부분은 풍향을 나타내고, 반경은 풍속이 높아질수록 파란색이 짙어집니다.

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

분석 결과, 이날 남서풍이 가장 많이 부는 것으로 나타났으며, 평균 풍속은 1.75레벨에 이르렀으며, 일부 북동풍은 1.0레벨에 도달했고, 그 외 다른 곳에서는 바람이 불지 않았습니다. 빈 방향.

다음 14일 동안의 고온 및 저온 변화 곡선 차트

향후 14일 동안의 고온 및 저온 변화를 통계하고 점선을 사용하여 평균 기온 선을 그려서 변화 곡선을 그립니다.

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

분석 결과, 향후 14일 평균 최고 기온은 30.5℃로 여전히 높은 편이지만, 앞으로 8일째는 추위에 대비해야 합니다. 저온은 안정적인 추세를 보이고 있으며, 8일째부터 감소하기 시작하여 고온도 떨어지며, 평균 저온은 27°C 안팎을 기록했습니다.

다음 14일 동안의 풍향 및 풍속 레이더 차트

향후 14일 동안의 풍향과 평균 풍속을 통계하고 이전과 같이 극좌표를 사용하여 원을 8개 부분으로 나누어 8개의 방향을 나타냅니다. 색상, 풍도가 높을수록 최종 결과는 다음과 같습니다.

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

분석 결과 향후 14일 동안 남동풍과 남서풍의 주요 풍향이 가장 높은 풍속이 5단계에 도달하는 것으로 나타났습니다. 가장 낮은 평균 서풍 수준은 레벨 3입니다.

다음 14일 동안의 기후 분포 파이 차트

다음 14일 동안의 기후를 통계하고, 각 기후에 대한 총 일수를 구합니다. 마지막으로, 각 기후에 대한 파이 차트를 그립니다.

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

분석 결과를 확인할 수 있습니다. 향후 14일의 기후는 기본적으로 '비', '흐림~비', '소나기'가 될 것으로 예상됩니다. 이전 기온 분포 차트와 결합하면 다음과 같습니다. 8일과 9일에는 기온이 떨어질 것으로 예상됩니다. 비가 내리면 기온이 떨어질 것으로 추측됩니다.

3. 결론

1. 먼저, 크롤링된 기온 및 습도 데이터를 분석한 결과, 기온은 아침에 낮고 낮에는 높으며 밤에는 기온이 낮습니다. 상관계수를 통해 온도와 습도는 음의 상관관계가 있음을 알 수 있었는데, 데이터를 검토한 결과 온도가 높아질수록 수증기 증발이 심해지고, 공기 중의 수분도 증가하는 것으로 나타났습니다. 줄어들고 습도도 낮아집니다. 물론 습도는 기압과 비의 영향을 받으며 비가 오면 습도가 크게 높아집니다.

2.经查阅资料空气质量不仅跟工厂、汽车等排放的烟气、废气等有关,更为重要的是与气象因素有关。由于昼夜温差明显变化,当地面温度高于高空温度时,空气上升,污染物易被带到高空扩散;当地面温度低于一定高度的温度时,天空形成逆温层,它像一个大盖子一样压在地面上空,使地表空气中各种污染物不易扩散。一般在晚间和清晨影响较大,而当太阳出来后,地面迅速升温,逆温层就会逐渐消散,于是污染空气也就扩散了。

3.风是由气压在水平方向分布的不均匀导致的。风受大气环流、地形、水域等不同因素的综合影响,表现形式多种多样,如季风、地方性的海陆风、山谷风等,一天的风向也有不同的变化,根据未来14天的风向雷达图可以发现未来所有风向基本都有涉及,并且没有特别的某个风向,原因可能是近期没有降水和气文变化不大,导致风向也没有太大的变化规律。

4.天气是指某一个地区距离地表较近的大气层在短时间内的具体状态。跟某瞬时内大气中各种气象要素分布的综合表现。根据未来14天的天气和温度变化可以大致推断出某个时间的气候,天气和温度之间也是有联系的。

4、代码框架

代码主要分为weather.py:对中国天气网进行爬取天气数据并保存csv文件;data1_analysis.py:对当天的天气信息进行可视化处理;data14_analysis.py:对未来14天的天气信息进行可视化处理。下面是代码的结构图:

Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?

附源代码

weather.py

# weather.py
import requests
from bs4 import BeautifulSoup
import csv
import json
def getHTMLtext(url):
"""请求获得网页内容"""
 try:
r = requests.get(url, timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
print("成功访问")
return r.text
 except:
print("访问错误")
return" "
def get_content(html):
"""处理得到有用信息保存数据文件"""
final = []# 初始化一个列表保存数据
bs = BeautifulSoup(html, "html.parser")# 创建BeautifulSoup对象
body = bs.body
data = body.find(&#39;div&#39;, {&#39;id&#39;: &#39;7d&#39;})# 找到div标签且id = 7d
# 下面爬取当天的数据
data2 = body.find_all('div',{'class':'left-div'})
text = data2[2].find('script').string
text = text[text.index('=')+1 :-2] # 移除改var data=将其变为json数据
jd = json.loads(text)
dayone = jd['od']['od2'] # 找到当天的数据
final_day = [] # 存放当天的数据
count = 0
for i in dayone:
 temp = []
 if count <=23:
temp.append(i['od21']) # 添加时间
temp.append(i['od22']) # 添加当前时刻温度
temp.append(i['od24']) # 添加当前时刻风力方向
temp.append(i['od25']) # 添加当前时刻风级
temp.append(i['od26']) # 添加当前时刻降水量
temp.append(i['od27']) # 添加当前时刻相对湿度
temp.append(i['od28']) # 添加当前时刻控制质量
#print(temp)
final_day.append(temp)
 count = count +1
 # 下面爬取7天的数据
ul = data.find('ul')# 找到所有的ul标签
li = ul.find_all('li')# 找到左右的li标签
i = 0 # 控制爬取的天数
for day in li:# 遍历找到的每一个li
if i < 7 and i > 0:
temp = []# 临时存放每天的数据
date = day.find('h2').string # 得到日期
date = date[0:date.index('日')] # 取出日期号
temp.append(date)
inf = day.find_all('p')# 找出li下面的p标签,提取第一个p标签的值,即天气
temp.append(inf[0].string)
tem_low = inf[1].find('i').string # 找到最低气温
if inf[1].find('span') is None: # 天气预报可能没有最高气温
tem_high = None
else:
tem_high = inf[1].find('span').string# 找到最高气温
temp.append(tem_low[:-1])
if tem_high[-1] == '℃':
 temp.append(tem_high[:-1])
else:
 temp.append(tem_high)
wind = inf[2].find_all('span')# 找到风向
for j in wind:
 temp.append(j['title'])
wind_scale = inf[2].find('i').string # 找到风级
index1 = wind_scale.index('级')
temp.append(int(wind_scale[index1-1:index1]))
final.append(temp)
i = i + 1
return final_day,final
#print(final)
def get_content2(html):
"""处理得到有用信息保存数据文件"""
final = []# 初始化一个列表保存数据
bs = BeautifulSoup(html, "html.parser")# 创建BeautifulSoup对象
body = bs.body
data = body.find('div', {'id': '15d'})# 找到div标签且id = 15d
ul = data.find('ul')# 找到所有的ul标签
li = ul.find_all('li')# 找到左右的li标签
final = []
i = 0 # 控制爬取的天数
for day in li: # 遍历找到的每一个li
if i < 8:
temp = [] # 临时存放每天的数据
date = day.find('span',{'class':'time'}).string# 得到日期
date = date[date.index('(')+1:-2]# 取出日期号
temp.append(date)
weather = day.find('span',{'class':'wea'}).string# 找到天气
temp.append(weather)
tem = day.find('span',{'class':'tem'}).text# 找到温度
temp.append(tem[tem.index('/')+1:-1]) # 找到最低气温
temp.append(tem[:tem.index('/')-1])# 找到最高气温
wind = day.find('span',{'class':'wind'}).string# 找到风向
if '转' in wind: # 如果有风向变化
 temp.append(wind[:wind.index('转')])
 temp.append(wind[wind.index('转')+1:])
else: # 如果没有风向变化,前后风向一致
 temp.append(wind)
 temp.append(wind)
wind_scale = day.find('span',{'class':'wind1'}).string# 找到风级
index1 = wind_scale.index('级')
temp.append(int(wind_scale[index1-1:index1]))
final.append(temp)
return final
def write_to_csv(file_name, data, day=14):
"""保存为csv文件"""
with open(file_name, 'a', errors='ignore', newline='') as f:
 if day == 14:
header = ['日期','天气','最低气温','最高气温','风向1','风向2','风级']
 else:
header = ['小时','温度','风力方向','风级','降水量','相对湿度','空气质量']
 f_csv = csv.writer(f)
 f_csv.writerow(header)
 f_csv.writerows(data)
def main():
"""主函数"""
print("Weather test")
# 珠海
url1 = 'http://www.weather.com.cn/weather/101280701.shtml'# 7天天气中国天气网
url2 = 'http://www.weather.com.cn/weather15d/101280701.shtml' # 8-15天天气中国天气网
html1 = getHTMLtext(url1)
data1, data1_7 = get_content(html1)# 获得1-7天和当天的数据
html2 = getHTMLtext(url2)
data8_14 = get_content2(html2) # 获得8-14天数据
data14 = data1_7 + data8_14
#print(data)
write_to_csv('weather14.csv',data14,14) # 保存为csv文件
write_to_csv('weather1.csv',data1,1)
if __name__ == '__main__':
main()
로그인 후 복사

data1_analysis.py:

# data1_analysis.py
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import math
def tem_curve(data):
"""温度曲线绘制"""
hour = list(data[&#39;小时&#39;])
tem = list(data[&#39;温度&#39;])
for i in range(0,24):
 if math.isnan(tem[i]) == True:
tem[i] = tem[i-1]
 tem_ave = sum(tem)/24 # 求平均温度
tem_max = max(tem)
tem_max_hour = hour[tem.index(tem_max)] # 求最高温度
tem_min = min(tem)
tem_min_hour = hour[tem.index(tem_min)] # 求最低温度
x = []
y = []
for i in range(0, 24):
 x.append(i)
 y.append(tem[hour.index(i)])
plt.figure(1)
plt.plot(x,y,color=&#39;red&#39;,label=&#39;温度&#39;) # 画出温度曲线
plt.scatter(x,y,color=&#39;red&#39;) # 点出每个时刻的温度点
plt.plot([0, 24], [tem_ave, tem_ave], c=&#39;blue&#39;, linestyle=&#39;--&#39;,label=&#39;平均温度&#39;)# 画出平均温度虚线
plt.text(tem_max_hour+0.15, tem_max+0.15, str(tem_max), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最高温度
plt.text(tem_min_hour+0.15, tem_min+0.15, str(tem_min), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最低温度
plt.xticks(x)
plt.legend()
plt.title(&#39;一天温度变化曲线图&#39;)
plt.xlabel(&#39;时间/h&#39;)
plt.ylabel(&#39;摄氏度/℃&#39;)
plt.show()
def hum_curve(data):
"""相对湿度曲线绘制"""
hour = list(data[&#39;小时&#39;])
hum = list(data[&#39;相对湿度&#39;])
for i in range(0,24):
 if math.isnan(hum[i]) == True:
hum[i] = hum[i-1]
 hum_ave = sum(hum)/24 # 求平均相对湿度
hum_max = max(hum)
hum_max_hour = hour[hum.index(hum_max)] # 求最高相对湿度
hum_min = min(hum)
hum_min_hour = hour[hum.index(hum_min)] # 求最低相对湿度
x = []
y = []
for i in range(0, 24):
 x.append(i)
 y.append(hum[hour.index(i)])
plt.figure(2)
plt.plot(x,y,color=&#39;blue&#39;,label=&#39;相对湿度&#39;) # 画出相对湿度曲线
plt.scatter(x,y,color=&#39;blue&#39;) # 点出每个时刻的相对湿度
plt.plot([0, 24], [hum_ave, hum_ave], c=&#39;red&#39;, linestyle=&#39;--&#39;,label=&#39;平均相对湿度&#39;)# 画出平均相对湿度虚线
plt.text(hum_max_hour+0.15, hum_max+0.15, str(hum_max), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最高相对湿度
plt.text(hum_min_hour+0.15, hum_min+0.15, str(hum_min), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最低相对湿度
plt.xticks(x)
plt.legend()
plt.title(&#39;一天相对湿度变化曲线图&#39;)
plt.xlabel(&#39;时间/h&#39;)
plt.ylabel(&#39;百分比/%&#39;)
plt.show()
def air_curve(data):
"""空气质量曲线绘制"""
hour = list(data[&#39;小时&#39;])
air = list(data[&#39;空气质量&#39;])
print(type(air[0]))
for i in range(0,24):
 if math.isnan(air[i]) == True:
air[i] = air[i-1]
 air_ave = sum(air)/24 # 求平均空气质量
air_max = max(air)
air_max_hour = hour[air.index(air_max)] # 求最高空气质量
air_min = min(air)
air_min_hour = hour[air.index(air_min)] # 求最低空气质量
x = []
y = []
for i in range(0, 24):
 x.append(i)
 y.append(air[hour.index(i)])
plt.figure(3)

for i in range(0,24):
 if y[i] <= 50:
plt.bar(x[i],y[i],color=&#39;lightgreen&#39;,width=0.7)# 1等级
 elif y[i] <= 100:
plt.bar(x[i],y[i],color=&#39;wheat&#39;,width=0.7) # 2等级
 elif y[i] <= 150:
plt.bar(x[i],y[i],color=&#39;orange&#39;,width=0.7) # 3等级
 elif y[i] <= 200:
plt.bar(x[i],y[i],color=&#39;orangered&#39;,width=0.7)# 4等级
 elif y[i]  300:
plt.bar(x[i],y[i],color=&#39;maroon&#39;,width=0.7) # 6等级
plt.plot([0, 24], [air_ave, air_ave], c=&#39;black&#39;, linestyle=&#39;--&#39;)# 画出平均空气质量虚线
plt.text(air_max_hour+0.15, air_max+0.15, str(air_max), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最高空气质量
plt.text(air_min_hour+0.15, air_min+0.15, str(air_min), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最低空气质量
plt.xticks(x)
plt.title(&#39;一天空气质量变化曲线图&#39;)
plt.xlabel(&#39;时间/h&#39;)
plt.ylabel(&#39;空气质量指数AQI&#39;)
plt.show()
def wind_radar(data):
"""风向雷达图"""
wind = list(data[&#39;风力方向&#39;])
wind_speed = list(data[&#39;风级&#39;])
for i in range(0,24):
 if wind[i] == "北风":
wind[i] = 90
 elif wind[i] == "南风":
wind[i] = 270
 elif wind[i] == "西风":
wind[i] = 180
 elif wind[i] == "东风":
wind[i] = 360
 elif wind[i] == "东北风":
wind[i] = 45
 elif wind[i] == "西北风":
wind[i] = 135
 elif wind[i] == "西南风":
wind[i] = 225
 elif wind[i] == "东南风":
wind[i] = 315
degs = np.arange(45,361,45)
temp = []
for deg in degs:
 speed = []
 # 获取 wind_deg 在指定范围的风速平均值数据
 for i in range(0,24):
if wind[i] == deg:
 speed.append(wind_speed[i])
 if len(speed) == 0:
temp.append(0)
 else:
temp.append(sum(speed)/len(speed))
print(temp)
N = 8
theta = np.arange(0.+np.pi/8,2*np.pi+np.pi/8,2*np.pi/8)
# 数据极径
radii = np.array(temp)
# 绘制极区图坐标系
plt.axes(polar=True)
# 定义每个扇区的RGB值(R,G,B),x越大,对应的颜色越接近蓝色
colors = [(1-x/max(temp), 1-x/max(temp),0.6) for x in radii]
plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors)
plt.title(&#39;一天风级图&#39;,x=0.2,fontsize=20)
plt.show()
def calc_corr(a, b):
"""计算相关系数"""
a_avg = sum(a)/len(a)
b_avg = sum(b)/len(b)
cov_ab = sum([(x - a_avg)*(y - b_avg) for x,y in zip(a, b)])
 sq = math.sqrt(sum([(x - a_avg)**2 for x in a])*sum([(x - b_avg)**2 for x in b]))
corr_factor = cov_ab/sq
return corr_factor
def corr_tem_hum(data):
"""温湿度相关性分析"""
tem = data[&#39;温度&#39;]
hum = data[&#39;相对湿度&#39;]
plt.scatter(tem,hum,color=&#39;blue&#39;)
plt.title("温湿度相关性分析图")
plt.xlabel("温度/℃")
plt.ylabel("相对湿度/%")
plt.text(20,40,"相关系数为:"+str(calc_corr(tem,hum)),fontdict={&#39;size&#39;:&#39;10&#39;,&#39;color&#39;:&#39;red&#39;})
plt.show()
print("相关系数为:"+str(calc_corr(tem,hum)))
def main():
plt.rcParams[&#39;font.sans-serif&#39;]=[&#39;SimHei&#39;] # 解决中文显示问题
plt.rcParams[&#39;axes.unicode_minus&#39;] = False# 解决负号显示问题
data1 = pd.read_csv(&#39;weather1.csv&#39;,encoding=&#39;gb2312&#39;)
print(data1)
tem_curve(data1)
hum_curve(data1)
air_curve(data1)
wind_radar(data1)
corr_tem_hum(data1)
if __name__ == &#39;__main__&#39;:
main()
data14_analysis.py:
# data14_analysis.py
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import math
def tem_curve(data):
"""温度曲线绘制"""
date = list(data[&#39;日期&#39;])
tem_low = list(data[&#39;最低气温&#39;])
tem_high = list(data[&#39;最高气温&#39;])
for i in range(0,14):
 if math.isnan(tem_low[i]) == True:
tem_low[i] = tem_low[i-1]
 if math.isnan(tem_high[i]) == True:
tem_high[i] = tem_high[i-1]
 tem_high_ave = sum(tem_high)/14 # 求平均高温
 tem_low_ave = sum(tem_low)/14 # 求平均低温

tem_max = max(tem_high)
tem_max_date = tem_high.index(tem_max) # 求最高温度
tem_min = min(tem_low)
tem_min_date = tem_low.index(tem_min) # 求最低温度
x = range(1,15)
plt.figure(1)
plt.plot(x,tem_high,color=&#39;red&#39;,label=&#39;高温&#39;)# 画出高温度曲线
plt.scatter(x,tem_high,color=&#39;red&#39;) # 点出每个时刻的温度点
plt.plot(x,tem_low,color=&#39;blue&#39;,label=&#39;低温&#39;)# 画出低温度曲线
plt.scatter(x,tem_low,color=&#39;blue&#39;) # 点出每个时刻的温度点

plt.plot([1, 15], [tem_high_ave, tem_high_ave], c=&#39;black&#39;, linestyle=&#39;--&#39;)# 画出平均温度虚线
plt.plot([1, 15], [tem_low_ave, tem_low_ave], c=&#39;black&#39;, linestyle=&#39;--&#39;)# 画出平均温度虚线
plt.legend()
plt.text(tem_max_date+0.15, tem_max+0.15, str(tem_max), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最高温度
plt.text(tem_min_date+0.15, tem_min+0.15, str(tem_min), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最低温度
plt.xticks(x)
plt.title(&#39;未来14天高温低温变化曲线图&#39;)
plt.xlabel(&#39;未来天数/天&#39;)
plt.ylabel(&#39;摄氏度/℃&#39;)
plt.show()
def change_wind(wind):
"""改变风向"""
for i in range(0,14):
 if wind[i] == "北风":
wind[i] = 90
 elif wind[i] == "南风":
wind[i] = 270
 elif wind[i] == "西风":
wind[i] = 180
 elif wind[i] == "东风":
wind[i] = 360
 elif wind[i] == "东北风":
wind[i] = 45
 elif wind[i] == "西北风":
wind[i] = 135
 elif wind[i] == "西南风":
wind[i] = 225
 elif wind[i] == "东南风":
wind[i] = 315
return wind
def wind_radar(data):
"""风向雷达图"""
wind1 = list(data[&#39;风向1&#39;])
wind2 = list(data[&#39;风向2&#39;])
wind_speed = list(data[&#39;风级&#39;])
wind1 = change_wind(wind1)
wind2 = change_wind(wind2)

degs = np.arange(45,361,45)
temp = []
for deg in degs:
 speed = []
 # 获取 wind_deg 在指定范围的风速平均值数据
 for i in range(0,14):
if wind1[i] == deg:
 speed.append(wind_speed[i])
if wind2[i] == deg:
 speed.append(wind_speed[i])
 if len(speed) == 0:
temp.append(0)
 else:
temp.append(sum(speed)/len(speed))
print(temp)
N = 8
theta = np.arange(0.+np.pi/8,2*np.pi+np.pi/8,2*np.pi/8)
# 数据极径
radii = np.array(temp)
# 绘制极区图坐标系
plt.axes(polar=True)
# 定义每个扇区的RGB值(R,G,B),x越大,对应的颜色越接近蓝色
colors = [(1-x/max(temp), 1-x/max(temp),0.6) for x in radii]
plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors)
plt.title(&#39;未来14天风级图&#39;,x=0.2,fontsize=20)
plt.show()
def weather_pie(data):
"""绘制天气饼图"""
weather = list(data[&#39;天气&#39;])
dic_wea = { }
for i in range(0,14):
 if weather[i] in dic_wea.keys():
dic_wea[weather[i]] += 1
 else:
dic_wea[weather[i]] = 1
print(dic_wea)
explode=[0.01]*len(dic_wea.keys())
color = [&#39;lightskyblue&#39;,&#39;silver&#39;,&#39;yellow&#39;,&#39;salmon&#39;,&#39;grey&#39;,&#39;lime&#39;,&#39;gold&#39;,&#39;red&#39;,&#39;green&#39;,&#39;pink&#39;]
plt.pie(dic_wea.values(),explode=explode,labels=dic_wea.keys(),autopct=&#39;%1.1f%%&#39;,colors=color)
plt.title(&#39;未来14天气候分布饼图&#39;)
plt.show()
def main():
plt.rcParams[&#39;font.sans-serif&#39;]=[&#39;SimHei&#39;] # 解决中文显示问题
plt.rcParams[&#39;axes.unicode_minus&#39;] = False# 解决负号显示问题
data14 = pd.read_csv(&#39;weather14.csv&#39;,encoding=&#39;gb2312&#39;)
print(data14)
tem_curve(data14)
wind_radar(data14)
weather_pie(data14)
if __name__ == &#39;__main__&#39;:
main()
로그인 후 복사

위 내용은 Python에서 날씨 데이터를 크롤링하고 시각적 분석을 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP와 Python : 다른 패러다임이 설명되었습니다 PHP와 Python : 다른 패러다임이 설명되었습니다 Apr 18, 2025 am 12:26 AM

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP와 Python 중에서 선택 : 가이드 PHP와 Python 중에서 선택 : 가이드 Apr 18, 2025 am 12:24 AM

PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

Windows 8에서 코드를 실행할 수 있습니다 Windows 8에서 코드를 실행할 수 있습니다 Apr 15, 2025 pm 07:24 PM

VS 코드는 Windows 8에서 실행될 수 있지만 경험은 크지 않을 수 있습니다. 먼저 시스템이 최신 패치로 업데이트되었는지 확인한 다음 시스템 아키텍처와 일치하는 VS 코드 설치 패키지를 다운로드하여 프롬프트대로 설치하십시오. 설치 후 일부 확장은 Windows 8과 호환되지 않을 수 있으며 대체 확장을 찾거나 가상 시스템에서 새로운 Windows 시스템을 사용해야합니다. 필요한 연장을 설치하여 제대로 작동하는지 확인하십시오. Windows 8에서는 VS 코드가 가능하지만 더 나은 개발 경험과 보안을 위해 새로운 Windows 시스템으로 업그레이드하는 것이 좋습니다.

VScode 확장자가 악의적입니까? VScode 확장자가 악의적입니까? Apr 15, 2025 pm 07:57 PM

VS 코드 확장은 악의적 인 코드 숨기기, 취약성 악용 및 합법적 인 확장으로 자위하는 등 악성 위험을 초래합니다. 악의적 인 확장을 식별하는 방법에는 게시자 확인, 주석 읽기, 코드 확인 및주의해서 설치가 포함됩니다. 보안 조치에는 보안 인식, 좋은 습관, 정기적 인 업데이트 및 바이러스 백신 소프트웨어도 포함됩니다.

Python에서 비주얼 스튜디오 코드를 사용할 수 있습니다 Python에서 비주얼 스튜디오 코드를 사용할 수 있습니다 Apr 15, 2025 pm 08:18 PM

VS 코드는 파이썬을 작성하는 데 사용될 수 있으며 파이썬 애플리케이션을 개발하기에 이상적인 도구가되는 많은 기능을 제공합니다. 사용자는 다음을 수행 할 수 있습니다. Python 확장 기능을 설치하여 코드 완료, 구문 강조 및 디버깅과 같은 기능을 얻습니다. 디버거를 사용하여 코드를 단계별로 추적하고 오류를 찾아 수정하십시오. 버전 제어를 위해 git을 통합합니다. 코드 서식 도구를 사용하여 코드 일관성을 유지하십시오. 라인 도구를 사용하여 잠재적 인 문제를 미리 발견하십시오.

터미널 VSCODE에서 프로그램을 실행하는 방법 터미널 VSCODE에서 프로그램을 실행하는 방법 Apr 15, 2025 pm 06:42 PM

vs 코드에서는 다음 단계를 통해 터미널에서 프로그램을 실행할 수 있습니다. 코드를 준비하고 통합 터미널을 열어 코드 디렉토리가 터미널 작업 디렉토리와 일치하는지 확인하십시오. 프로그래밍 언어 (예 : Python의 Python Your_file_name.py)에 따라 실행 명령을 선택하여 성공적으로 실행되는지 여부를 확인하고 오류를 해결하십시오. 디버거를 사용하여 디버깅 효율을 향상시킵니다.

Python vs. JavaScript : 학습 곡선 및 사용 편의성 Python vs. JavaScript : 학습 곡선 및 사용 편의성 Apr 16, 2025 am 12:12 AM

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

vScode를 Mac에 사용할 수 있습니다 vScode를 Mac에 사용할 수 있습니다 Apr 15, 2025 pm 07:36 PM

VS 코드는 Mac에서 사용할 수 있습니다. 강력한 확장, GIT 통합, 터미널 및 디버거가 있으며 풍부한 설정 옵션도 제공합니다. 그러나 특히 대규모 프로젝트 또는 고도로 전문적인 개발의 경우 VS 코드는 성능 또는 기능 제한을 가질 수 있습니다.

See all articles