• 使用chatGPT开发获取格点天气数据


    1. 格点天气

    1.1. 格点天气

    经纬度为基准的全球高精度、公里级、格点化天气预报产品,包括任意经纬度的实时天气和天气预报。其中,任意坐标的高精度天气,精确到3-5公里范围,包括:温度、湿度、大气压、天气状况、风力、风向等。

    注意:格点天气是一种数值预报,由卫星、气象雷达等数据通过模型算法运算而来,它可能受到许多因素的影响,如山脉、建筑物、人类活动、大气变化等。格点天气与观测站数据会有所不同,不可直接对比。

    1.1. 格点天气预报

    格点天气预报是一种基于空间插值方法,以一定空间分辨率在网格点上对大气各种物理量进行预报的技术。它通过对大气物理量进行网格化,以空间分辨率较高的方式预测未来气象变化。具体来说,格点天气预报通常采用的是数值天气预报模式,将地球分为一系列网格,利用物理方程计算每个网格内的天气参数,然后通过时间积分来预报未来天气。

    格点天气预报的特点是可以提供较高精度的天气预报,因为它可以更好地捕捉小尺度天气现象和局地气象变化。此外,格点天气预报也可以针对不同的应用场景提供不同的预报结果。例如,针对航空、海洋、农业、城市气象等不同领域提供不同的预报数据,可以帮助相关领域做出更加准确的决策。

    1.2. 格点实时天气

    格点实时天气则是指利用近地观测数据以及格点天气模型,通过插值算法实时生成各类气象要素的技术。它可以快速生成气象要素的分布状态,并通过预报模型对未来几小时的变化趋势进行预报。这种技术可以用于实时监测和预警天气灾害、航空、海洋等领域的气象服务。

    格点实时天气的特点是具有实时性和准确性。通过使用近地观测数据,它可以更加准确地反映实际天气状况,并及时提供气象预警服务。此外,由于实时预报的时间较短,因此其分辨率更高,能够更好地反映小尺度天气现象的变化。

    2. 如何获取气象数据服务

    本文以和风天气为例,注册用户(免费/收费),使用其API接口,详见“开始使用”。

    2.1. 注册用户

    第一步 注册帐号
    首先你需要一个和风天气的帐号,关于帐号的说明文档,请参考帐号管理。

    点击注册!

    第二步 创建项目和KEY
    在控制台的左侧导航中,选择项目管理,并点击右上角的“创建项目”按钮。参考项目和KEY。

    在创建项目时,需要同时选择一种订阅,例如:免费订阅、标准订阅或高级订阅,我们这里暂时以免费订阅为例。参考订阅。

    第三步 获取数据
    在浏览器中输入下列API地址(请将最后的KEY替换成你在上一步创建的KEY):

    https://devapi.qweather.com/v7/weather/now?location=101010100&key=你的KEY
    如果在上一步选择的是标准订阅,请确保你的帐号可用额度≥10,并在浏览器中输入下列API地址:

    https://api.qweather.com/v7/weather/now?location=101010100&key=你的KEY
    此时你应该就可以获得北京市的实时天气数据了。不过请注意,免费订阅仅支持有限的数据和请求量,请参考订阅对比。

    第四步 更多数据
    参考开发文档获取更多数据。

    2.2. API

    对于和风天气网的格点天气,对应API及参数如下:

    格点24小时天气预报API:

    • url=“https://devapi.qweather.com/v7/grid-weather/24h?”

    • location=‘103.59984,36.18057’ ,换成自己实际的 经、纬度

    • key=‘***************’ #我自己的和风天气key

    格点实时天气数据API:

    • url=“https://devapi.qweather.com/v7/grid-weather/now?”

    • location=‘103.59984,36.18057’ ,换成自己实际的 经、纬度

    • key=‘***************’ #我自己的和风天气key

    返回结果集:

    • code API状态码,具体含义请参考状态码
    • updateTime 当前API的最近更新时间
    • fxLink 当前数据的响应式页面,便于嵌入网站或应用
    • now.obsTime 数据观测时间
    • now.temp 温度,默认单位:摄氏度
    • now.icon 天气状况和图标的代码,图标可通过天气状况和图标下载
    • now.text 天气状况的文字描述,包括阴晴雨雪等天气状态的描述
    • now.wind360 风向360角度
    • now.windDir 风向
    • now.windScale 风力等级
    • now.windSpeed 风速,公里/小时
    • now.humidity 相对湿度,百分比数值
    • now.precip 当前小时累计降水量,默认单位:毫米
    • now.pressure 大气压强,默认单位:百帕
    • now.cloud 云量,百分比数值。可能为空
    • now.dew 露点温度。可能为空
    • refer.sources 原始数据来源,或数据源说明,可能为空
    • refer.license 数据许可或版权声明,可能为空

    3. 使用chatGPT开发python获取格点天气数据

    开发获取格点天气数据,与发电数据(电量)结合构建机器学习数据集,需要是个后台的服务,为了快速、高质量实现,我选择了chatGPT协助实现。

    3.1. chatGPT写的代码

    import requests
    import csv
    import time
    import datetime
    import keyboard
    
    # API接口
    url = "https://devapi.qweather.com/v7/grid-weather/now"
    
    # 请求参数,location为经纬度坐标,key为API密钥
    params = {
        "location": "103.59984,36.18057",
        "key": "**********"
    }
    
    fieldnames = ['obsTime', 'temp', 'icon', 'text', 'wind360', 'windDir', 'windScale', 'windSpeed', 'humidity', 'precip', 'pressure', 'cloud', 'dew']
    
    # csv文件名
    filename = 'weather_data.csv'
    
    # 获取天气数据
    while True:
        # 按下Esc键退出
        if keyboard.is_pressed('Esc'):
            print('程序已退出')
            break
        
        # 获取当前时间
        current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    
        # 判断是否为整点或半点
        if current_time.split(":")[1] in ["00", "30"]:     
            # 发送API请求并获取返回结果
            response = requests.get(url, params=params)
            result = response.json()
    
            # 提取关键数据并写入csv文件
            now_data = result['now']
            with open(filename, mode='a', newline='') as file:
                writer = csv.DictWriter(file, fieldnames=fieldnames)
                if file.tell() == 0:
                    writer.writeheader()
               
                writer.writerow(now_data)
    
            # 记录日志
            with open('log.txt', mode='a') as log:
                log.write(f'{current_time}:获取天气数据成功\n')
    
        # 程序等待60秒钟后再次执行
        time.sleep(60)  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    3.2. 与chatGPT沟通过程,清晰、准确描述需求

    下面是我与其沟通过程:

    我:
    使用python语言,开发自动逐时获取天气数据服务,输入Esc键退出。
    使用如下API接口获取当前天气数据,
    https://devapi.qweather.com/v7/grid-weather/now?location=103.59984,36.18057&key=***********
    数据保存为csv格式,并记录每次取数据的日志。

    chatGPT:

    import requests
    import csv
    import time
    
    # API接口地址
    url = "https://devapi.qweather.com/v7/grid-weather/now"
    
    # 请求参数,根据需要修改
    params = {
        "location": "103.59984,36.18057",
        "key": "***********"
    }
    
    # csv文件名
    filename = "weather_data.csv"
    
    # 日志文件名
    log_filename = "weather_log.txt"
    
    # 逐时获取天气数据
    with open(filename, mode="a", newline="") as csv_file, open(log_filename, mode="a") as log_file:
        writer = csv.writer(csv_file)
        while True:
            try:
                # 发送请求
                response = requests.get(url, params=params)
                # 解析响应数据
                data = response.json()
                # 提取需要的数据
                obs_time = data["updateTime"]
                temp = data["gridTemperature"]
                humidity = data["humidity"]
                wind_speed = data["windSpeed"]
                # 写入csv文件
                writer.writerow([obs_time, temp, humidity, wind_speed])
                # 写入日志文件
                log_file.write(f"{obs_time}: success\n")
            except Exception as e:
                # 发生异常时写入日志文件
                log_file.write(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}: error {str(e)}\n")
            # 暂停1小时后继续下一次循环
            time.sleep(3600)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    其中,您需要将API接口地址、请求参数、文件名等信息修改为实际情况,并使用自己的API密钥进行授权认证。程序会不断逐时获取天气数据,并将数据保存到csv文件中,同时记录每次取数据的日志。按下Esc键可退出程序。

    我:
    我没有说清晰,取数据的时间为整点,帮着调整下程序。

    chatGPT:

    import requests
    import csv
    import time
    import datetime
    
    # API接口
    url = "https://devapi.qweather.com/v7/grid-weather/now"
    
    # 请求参数,location为经纬度坐标,key为API密钥
    params = {
        "location": "103.59984,36.18057",
        "key": "***********"
    }
    
    # 循环获取数据
    while True:
        # 获取当前时间
        now = datetime.datetime.now()
        
        # 判断是否为整点
        if now.minute == 0 and now.second == 0:
            # 发送请求获取数据
            response = requests.get(url, params=params)
            data = response.json()
            
            # 打印数据
            print(data)
            
            # 保存数据到csv文件
            with open("weather.csv", mode="a", newline="") as file:
                writer = csv.writer(file)
                writer.writerow([now.strftime("%Y-%m-%d %H:%M:%S"), data["now"]["temp"], data["now"]["humidity"]])
            
            # 记录日志
            with open("log.txt", mode="a") as file:
                file.write(f"{now.strftime('%Y-%m-%d %H:%M:%S')}:获取数据成功\n")
            
        # 等待1分钟
        time.sleep(60)
        
        # 监听键盘,按下Esc键退出循环
        if msvcrt.kbhit():
            if ord(msvcrt.getch()) == 27:
                print("退出程序")
                break
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    这里使用了Python标准库中的datetime模块来获取当前时间,判断是否为整点,并将时间格式化成字符串。同时,每次获取数据时,记录当前时间到日志文件中。

    我:
    还麻烦你补充一点,csv数据中,需要补充数据字段名称,例如数据内容如下: ‘now’: {‘obsTime’: ‘2023-04-27T09:00+00:00’, ‘temp’: ‘10’, ‘icon’: ‘100’, ‘text’: ‘晴’, ‘wind360’: ‘63’, ‘windDir’: ‘东北风’, ‘windScale’: ‘5’, ‘windSpeed’: ‘30’, ‘humidity’: ‘46’, ‘precip’: ‘0.0’, ‘pressure’: ‘820’, ‘cloud’: ‘25’, ‘dew’: ‘-1’}

    chatGPT:

    fieldnames = ['obsTime', 'temp', 'icon', 'text', 'wind360', 'windDir', 'windScale', 'windSpeed', 'humidity', 'precip', 'pressure', 'cloud', 'dew']
    
    with open('weather.csv', mode='a', newline='') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        if file.tell() == 0:
            writer.writeheader()
        writer.writerow(data)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    其中fieldnames是一个列表,包含每个数据字段的名称,writer.writeheader()可以在第一次写入数据时自动添加字段名称行。

    我:
    非常好,谢谢!
    再麻烦一下,我要没间隔30分钟,取一次数据,帮修改下代码。

    chatGPT:

    import requests
    import csv
    import time
    import keyboard
    
    # API接口和参数
    url = 'https://devapi.qweather.com/v7/grid-weather/now'
    location = '103.59984,36.18057'
    key = '***********'
    params = {'location': location, 'key': key}
    
    # 字段名
    fieldnames = ['obsTime', 'temp', 'icon', 'text', 'wind360', 'windDir', 'windScale', 'windSpeed', 'humidity', 'precip', 'pressure', 'cloud', 'dew']
    
    # csv文件名
    filename = 'weather_data.csv'
    
    # 打开文件并写入字段名
    with open(filename, mode='a', newline='') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
    
    # 获取天气数据
    while True:
        # 按下Esc键退出
        if keyboard.is_pressed('Esc'):
            print('程序已退出')
            break
        
        # 获取当前时间
        current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        
        # 发送API请求并获取返回结果
        response = requests.get(url, params=params)
        result = response.json()
        
        # 提取关键数据并写入csv文件
        now_data = result['now']
        with open(filename, mode='a', newline='') as file:
            writer = csv.DictWriter(file, fieldnames=fieldnames)
            writer.writerow(now_data)
        
        # 记录日志
        with open('log.txt', mode='a') as log:
            log.write(f'{current_time}:获取天气数据成功\n')
        
        # 程序等待30分钟后再次执行
        time.sleep(1800)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    这段代码和之前的代码相似,只是将 time.sleep(3600) 修改为 time.sleep(1800),即程序等待30分钟后再次执行。同时,日志记录的内容也有所修改,加上了获取天气数据成功的记录。

    我:
    非常棒了,我遗漏了,再补充上整点和半点取数。

    chatGPT:
    代码详见下文,略。
    这个版本的代码会在每个整点和半点取一次数据,并将数据保存到CSV文件中。同时也会记录每次取数据的日志,保存在文本文件weather_log.txt中。

    3.3. 运行程序

    保存csv数据文件内容截取如下:
    在这里插入图片描述

    注意:时间与北京时间时差8小时,请在后续数据使用时注意、处理。

    中间出现了被强制断开的情况,原因未知。

    requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054,
     '远程主机强迫关闭了一个现有的连接。', None, 10054, None))
    
    • 1
    • 2

    4. 总结

    格点天气数据服务内容很全面、功能很好用。

    使用chatGPT开发,对于具体、通用性强的功能,其写代码能力还是比较厉害的,特别是能持续沟通、完善过程,更是值得称赞的。

    你用chatGPT写代码吗?

  • 相关阅读:
    网络编程及三大协议(TCP + UDP + Http)
    汇编语言访问寄存器和内存篇---02
    【操作系统笔记】操作系统
    深度强化学习+大模型综述Survey on Large Language Model-Enhanced Reinforcement Learning
    竞赛 深度学习+python+opencv实现动物识别 - 图像识别
    Vue中组件化编码使用(实战练习一)
    【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷E
    【Java+SpringBoot】原材料管理系统_仓库管理系统(源码+远程部署+项目定制开发+代码讲解+答辩教学+计算机毕业设计+计算机毕设)
    LNMP创建论坛
    多表查询(连接查询)
  • 原文地址:https://blog.csdn.net/xiaoyw/article/details/130413549