北京全年天氣狀況分析

Crossin先生發表於2019-04-03
本文來自 @範洺源 投稿,在其基礎上做了點修改

最近在學爬蟲和資料分析,看到天氣網上有國內城市一年的天氣歷史資料,想以此為資料來源練習一下,於是就有了這個專案。今天在此簡單介紹一下實現思路和最終效果。

用到的相關庫包括:

  • requests
  • bs4
  • pandas
  • matplotlib
  • seaborn
  • pyecharts

分析資料來源

天氣網的歷史天氣預報查詢頁面(lishi.tianqi.com/)上有各城市的資料。以北京為例,開啟頁面之後經過簡單的嘗試就可以發現,每個月的資料是以http://lishi.tianqi.com/{城市的拼音}/{年份+月份}.html這樣的地址來展示的,於是可據此構建一個函式,函式的作用是預設返回北京市2018年1月到12月的 url:

def get_url(city='beijing'):
    for time in range(201801,201813):
        url = "http://lishi.tianqi.com/{}/{}.html".format(city,time)
        yield url複製程式碼

爬取資料

有了 url 地址就可以用 requests 來抓取。這裡要注意,得加上自己的 cookies,否則會返回 404 頁面,應該是對方網站做了反爬。拿到返回值之後,我用 bs4 庫的 select函式提取資料。select 函式使用的是 css 選擇器的語法。由於需要進行一定的資料分析,所以這裡沒有將資料儲存到檔案,而是直接使用 pandasdataframe 進行儲存。

html = requests.get(url=url, headers=header, cookies=cookie)
soup = BeautifulSoup(html.content, 'html.parser')
date = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(1) > a")
max_temp = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(2)")
min_temp = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(3)")
weather = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(4)")
wind_direction = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(5)")
date = [x.text for x in date]
max_temp = [x.text for x in max_temp[1:]]
min_temp = [x.text for x in min_temp[1:]]
weather = [x.text for x in weather[1:]]
wind_direction = [x.text for x in wind_direction[1:]]
data = pd.DataFrame([date,max_temp,min_temp,weather,wind_direction]).T複製程式碼

對12個月份進行抓取後再彙總,就得到了北京2018年全年的天氣資料,包括最高溫度、最低溫度、天氣狀況、風向等資訊。適當加工下資訊,我們用一些圖表來進行視覺化的展示:

平均溫度的分佈

seaborn.distplot(result['平均溫度'])複製程式碼
北京全年天氣狀況分析

平均溫度是使用每日最高溫度和最低溫度取平均的值。北京平均溫度在0度和20多度的日子是最多的。

按月檢視溫度走勢

result.groupby(result['日期'].apply(lambda x:x.month)).mean().plot(kind='line')複製程式碼
北京全年天氣狀況分析

天氣狀況分佈

seaborn.countplot(result['天氣狀況'])複製程式碼
北京全年天氣狀況分析

晴天和多雲是北京一年中主要的天氣。

各月降水天數統計

line = pyecharts.Line("各月降水天數統計")
line.add("降水天數", month, is_rain, is_fill=True, area_opacity=0.7, is_stack=True)
line.add("未降水天數", month, no_rain, is_fill=True, area_opacity=0.7, is_stack=True)複製程式碼
北京全年天氣狀況分析

這裡用 pyecharts 做了一個堆疊折線圖。北京的降水天數不多,主要在7、8月份。可以對比下重慶的資料,差別就很明顯了:

北京全年天氣狀況分析

風向統計

directions = ['北風', '西北風', '西風', '西南風', '南風', '東南風', '東風', '東北風']
schema = []
v = []
days = result['風向'].value_counts()
for d in directions:
    schema.append((d,100))
    v.append(days[d])
v = [v]
radar = pyecharts.Radar()
radar.config(schema)
radar.add("風向統計", v, is_axisline_show=True)複製程式碼
北京全年天氣狀況分析

為了讓結果更加直觀,這裡採用了 pyecharts 裡的雷達圖,並且將8個維度按真實方向的角度來排列。通常認為,北京冬季盛行西北風,夏季盛行東南風。不過從資料上來看,西南風才是北京2018年的最熱門的風向。

以上就是我這個專案所做的工作,內容還是比較基礎的。大家可以做進一步的擴充套件,比如爬取其他的城市,然後進行全國多城市的天氣比較,或者結合地圖進行視覺化。

幾個相關庫的官網都很不錯,供參考:

  1. requests cn.python-requests.org/
  2. bs4 crummy.com/software/Bea
  3. pyecharts pyecharts.org/
  4. seaborn seaborn.pydata.org/
  5. pandas pandas.pydata.org/


文章原始碼及相關檔案已上傳,獲取程式碼及視覺化效果可在公眾號(Crossin的程式設計教室)回覆關鍵字 天氣


本文是我們程式設計教室新春徵稿活動的一篇投稿,來自 @範洺源 同學。

我們程式設計教室會持續向所有人開放,如果有投稿或參與志願者的意向,歡迎隨時在公眾號裡給我們留言。

Python | 新手引導 | 一圖學Python
開發案例:智慧防擋彈幕 | 紅包提醒 | 流浪地球 | 漫威
歡迎搜尋及關注:Crossin的程式設計教室

北京全年天氣狀況分析

相關文章