Python 分析天气,告诉你中秋应该去哪里

点击上方“Python数据之道”,选择“星标公众号”

收藏文章的同时,不要忘记「在看

640?wx_fmt=jpeg

来源:萝卜大杂烩

中秋佳节将近,不知道各位小伙伴儿有没有想好去哪里玩呢。不过说实在的,每到节假日,到处都是人山人海,那句“我动也不能动”,还不时的出现在我的耳畔呢。

但是又说回来,假期出游,除了人的因素外,天气的因素是不是也要考虑下呢,今天,我们就带大家来看看,中秋小长假,哪些地方适宜出游。

—  1 

获取数据

数据的获取,就从中国天气网站上直接抓取,网络上的一些 API,有的信息不是很全,只能获取最近3天的数据,有的又需要付费,还不如自己抓来的痛快。

http://www.weather.com.cn/weather15d/10124020102A.shtml

网站也没有做什么限制,我们抓数据的时候,只需要控制好访问频率,不要影响人家的正常运行就可以。

同时还需要准备四个数据文件

  • 省会城市列表,provincial_capital

  • 全国城市 id 信息表,china-city-list.csv

  • 著名景点名称列表,attractions

  • 全国景点 id 信息表,china-scenic-list.txt

抓取的过程不再详细说明了,直接给出完整代码

# coding = utf-8
"""
@author: zhou
@time:2019/9/5 14:36
@File: main.py
"""

import requests
from bs4 import BeautifulSoup
import time
import os


def get_data(name, city, code):
    print("正在下载城市%s的数据" % city)
    url = 'http://www.weather.com.cn/weather15d/%s.shtml' % code[2:]
    res = requests.get(url).content.decode()
    content = BeautifulSoup(res, "html.parser")
    weather_list = content.find('ul', attrs={'class': 't clearfix'}).find_all('li')
    items = map(parse_item, weather_list)
    save_to_csv(name, city, items)
    time.sleep(1)


def parse_item(item):
    time = item.find('span', attrs={'class': 'time'}).text
    wea = item.find('span', attrs={'class': 'wea'}).text
    tem = item.find('span', attrs={'class': 'tem'}).text
    wind = item.find('span', attrs={'class': 'wind'}).text
    wind_level = item.find('span', attrs={'class': 'wind1'}).text
    result = {
        "time": time,
        "wea": wea,
        "tem": tem,
        "wind": wind,
        "wind_level": wind_level
    }
    return result


def save_to_csv(name, city, data):
    if not os.path.exists('%s_data.csv' % name):
        with open('%s_data.csv' % name, 'a+', encoding='utf-8') as f:
            f.write('city,time,wea,tem,wind,wind_level\n')
            for d in data:
                try:
                    row = '{},{},{},{},{},{}'.format(city,
                                                     d['time'],
                                                     d['wea'],
                                                     d['tem'],
                                                     d['wind'],
                                                     d['wind_level'])
                    f.write(row)
                    f.write('\n')
                except:
                    continue
    else:
        with open('%s_data.csv' % name, 'a+', encoding='utf-8') as f:
            for d in data:
                try:
                    row = '{},{},{},{},{},{}'.format(city,
                                                     d['time'],
                                                     d['wea'],
                                                     d['tem'],
                                                     d['wind'],
                                                     d['wind_level'])
                    f.write(row)
                    f.write('\n')
                except:
                    continue


if __name__ == '__main__':
    import pandas as pd
    provincial = pd.read_csv('provincial_capital')
    china_city_code = pd.read_csv('china-city-list.csv')
    china_scenic_code = pd.read_csv('china-scenic-list.txt', sep='\t')
    china_scenic_code.columns = ['ID', 'name', 'area', 'provincial']
    attraction = pd.read_csv('attractions')
    provincial_data = pd.DataFrame()
    attraction_data = pd.DataFrame()

    # 省会抓取
    for i in provincial['city'].values.tolist():
        for j in china_city_code['City_CN'].values.tolist():
            if j == i:
                provincial_data = pd.concat([china_city_code[china_city_code['City_CN'] == j], provincial_data])

    for city in provincial_data['City_CN'].values.tolist():
        city_id = provincial_data[provincial_data['City_CN'] == city]['City_ID'].values.tolist()[0]
        get_data('weather', city, city_id)

    # 景点抓取
    for a in attraction['attractions'].values.tolist():
        for c in china_scenic_code['name'].values.tolist():
            if c == a:
                attraction_data = pd.concat([china_scenic_code[china_scenic_code['name'] == c], attraction_data])

    for attrac in attraction_data['name'].values.tolist():
        city_id = attraction_data[attraction_data['name'] == attrac]['ID'].values.tolist()[0]
        get_data('attraction', attrac, city_id)


—  2 

省会天气分析

我们首先来看看省会天气,毕竟省会城市是每个省份的中心,也是旅游的重点城市。

降水和温度

对于降水的概率,我采取的是如果预报是有雨,则设置降水概率为80,如果是预报是晴,则降水概率为20.

weather_dict = {
    "snow": 100,
    "rain": 80,
    "cloud": 50,
    "overcast": 60,
    "sun": 20
}

在中秋节这一天,各个省会城市的降水和温度

640?wx_fmt=gif

能够看出,大部分城市在这一天都是天公不作美的,降水的概率都非常的大。而温度的话,大概率降水的城市,温度都不是很高,早晚出行,可能还会很凉哦。温度最高的应该就是南昌了,还能达到30°C,一个艳阳高照的日子,是不是去看看革命圣地?

接下来我们再通过一个双轴图来更加直观的查看下降水和温度的情况

640?wx_fmt=gif

看来在进入9月之后,全国普遍的温度都在慢慢回落了,温度适宜出行,但是就是会伴随着绵绵的细雨呀。

再来看下几大城市在中秋前后一周的天气情况

北京

640?wx_fmt=png

北京的气温还是比较平稳的,没有太大的波动,可能早晚一件薄外套就能hold的住,不过这几天,应该都会是阴蒙蒙的,不会有太好的阳光。

上海

640?wx_fmt=png

上海的降水概率要比北京大一些,不过温度倒是相差不多。

杭州

640?wx_fmt=png

杭州的平均温度还是要高一些,降水的概率也较高,毕竟典型的东南沿海城市嘛,雨天的西湖,你期待不?

成都

640?wx_fmt=png

成都基本天天下雨了,那还出门看大熊猫嘛,这是个问题啊!

—  3 

著名景区天气

下面我们再来看看一些著名景区的天气情况,我大好河山,景区太多了,只能简单列举一些最著名的地方来看看了。

降水情况

640?wx_fmt=gif

在我选取的这些景区当中,大部分都是会有降水的,不过也会有阳光明媚的地方。比如说黄山和八达岭长城,预计会是晴天,去爬爬长城和黄山,是不错的选择。而美丽的九寨沟和西湖等,虽说会下雨,但是在雨天漫步,也不失为一种情趣吧。

降水和温度

我们再来看看各地的温度情况

640?wx_fmt=gif

不知道为啥承德的温度会那么低,感觉去避暑已经不太合适了,而长白山已经只有7°C了,慌不慌?

—  4 

降水与温度分布

降水

640?wx_fmt=gif

进入9月,东南沿海降水明显增多,京津地区也是阴雨连绵,这是一场秋雨一场寒的节奏吗!

温度

640?wx_fmt=gif

东南半壁,温度还是比较适宜的,现在的天气下,不冷不热,正是出游好温度。

好了,今天的分析就到这里了,那么,你中秋节最终的选择是哪里呢?

最后,公众号「萝卜大杂烩」后台回复”中秋“,可以获得完整源码!

-------------------End-------------------

640?wx_fmt=jpeg
 「Python数据之道 」建立了读者交流群,大家可以添加管理员微信进行加群
640?wx_fmt=jpeg
扫描添加好友
回复 “ 资源
640?wx_fmt=jpeg
640?wx_fmt=jpeg
推荐下我新开的公众号「柠檬2069」,走出技术圈,成就更好的自己~
柠檬2069
遇见未来
挖掘更好的自己
640?wx_fmt=jpeg
觉得内容还不错的话,给我点个“ 在看 ”呗
640?wx_fmt=gif
640?wx_fmt=gif
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值