首页 > 编程问答 >将 Met Office 数据点 JSON 读入 Panda

将 Met Office 数据点 JSON 读入 Panda

时间:2024-07-20 20:03:57浏览次数:9  
标签:python json pandas datapoint

我正在使用 MetOffice Datapoint API 下载 JSON 格式的英国天气数据。然后我想将该 JSON 文件读入 pandas DataFrame。 JSON文件的格式如图所示

{"SiteRep":{"Wx":{"Param":[{"name":"FDm","units":"C","$":"Feels Like Day Maximum Temperature"},{"name":"FNm","units":"C","$":"Feels Like Night Minimum Temperature"},{"name":"Dm","units":"C","$":"Day Maximum Temperature"},{"name":"Nm","units":"C","$":"Night Minimum Temperature"},{"name":"Gn","units":"mph","$":"Wind Gust Noon"},{"name":"Gm","units":"mph","$":"Wind Gust Midnight"},{"name":"Hn","units":"%","$":"Screen Relative Humidity Noon"},{"name":"Hm","units":"%","$":"Screen Relative Humidity Midnight"},{"name":"V","units":"","$":"Visibility"},{"name":"D","units":"compass","$":"Wind Direction"},{"name":"S","units":"mph","$":"Wind Speed"},{"name":"U","units":"","$":"Max UV Index"},{"name":"W","units":"","$":"Weather Type"},{"name":"PPd","units":"%","$":"Precipitation Probability Day"},{"name":"PPn","units":"%","$":"Precipitation Probability Night"}]},"DV":{"dataDate":"2024-07-20T09:00:00Z","type":"Forecast","Location":{"i":"3210","lat":"54.5181","lon":"-3.615","name":"ST. BEES HEAD","country":"ENGLAND","continent":"EUROPE","elevation":"124.0","Period":[{"type":"Day","value":"2024-07-20Z","Rep":[{"D":"SSE","Gn":"9","Hn":"93","PPd":"91","S":"7","V":"GO","Dm":"19","FDm":"18","W":"15","U":"3","$":"Day"},{"D":"NW","Gm":"22","Hm":"93","PPn":"80","S":"16","V":"VG","Nm":"11","FNm":"9","W":"12","$":"Night"}]},{"type":"Day","value":"2024-07-21Z","Rep":[{"D":"WSW","Gn":"16","Hn":"78","PPd":"50","S":"11","V":"VG","Dm":"16","FDm":"13","W":"7","U":"5","$":"Day"},{"D":"S","Gm":"29","Hm":"94","PPn":"85","S":"18","V":"MO","Nm":"13","FNm":"11","W":"15","$":"Night"}]},{"type":"Day","value":"2024-07-22Z","Rep":[{"D":"WSW","Gn":"29","Hn":"90","PPd":"55","S":"18","V":"VG","Dm":"17","FDm":"13","W":"12","U":"5","$":"Day"},{"D":"NW","Gm":"20","Hm":"89","PPn":"9","S":"13","V":"VG","Nm":"12","FNm":"11","W":"0","$":"Night"}]},{"type":"Day","value":"2024-07-23Z","Rep":[{"D":"WNW","Gn":"20","Hn":"69","PPd":"5","S":"11","V":"VG","Dm":"18","FDm":"15","W":"3","U":"7","$":"Day"},{"D":"WSW","Gm":"9","Hm":"91","PPn":"4","S":"7","V":"VG","Nm":"11","FNm":"12","W":"7","$":"Night"}]},{"type":"Day","value":"2024-07-24Z","Rep":[{"D":"SSW","Gn":"29","Hn":"74","PPd":"60","S":"16","V":"VG","Dm":"18","FDm":"14","W":"7","U":"6","$":"Day"},{"D":"SSW","Gm":"25","Hm":"95","PPn":"81","S":"16","V":"MO","Nm":"14","FNm":"12","W":"15","$":"Night"}]}]}}}}

当我读到这是一个panda DataFrame时,该框架仅包含两行,Wx和DF。如何将此 JSON 读入 pandas 数据帧(以便“Wx”是索引,“DV”是数据值?)。下面的代码没有做我想要的事情...

import pandas as pd
df = pd.read_json(<data>)

结果是这样的 DataFrame的截图


JSON 数据的结构被嵌套,这使得直接将其读入 Pandas DataFrame 变得有点棘手。你需要先对数据进行一些预处理。

以下是使用 json 库加载数据,对其进行重构以适应 DataFrame,然后创建 DataFrame 的方法:

import json
import pandas as pd

data = """
{"SiteRep":{"Wx":{"Param":[{"name":"FDm","units":"C","$":"Feels Like Day Maximum Temperature"},{"name":"FNm","units":"C","$":"Feels Like Night Minimum Temperature"},{"name":"Dm","units":"C","$":"Day Maximum Temperature"},{"name":"Nm","units":"C","$":"Night Minimum Temperature"},{"name":"Gn","units":"mph","$":"Wind Gust Noon"},{"name":"Gm","units":"mph","$":"Wind Gust Midnight"},{"name":"Hn","units":"%","$":"Screen Relative Humidity Noon"},{"name":"Hm","units":"%","$":"Screen Relative Humidity Midnight"},{"name":"V","units":"","$":"Visibility"},{"name":"D","units":"compass","$":"Wind Direction"},{"name":"S","units":"mph","$":"Wind Speed"},{"name":"U","units":"","$":"Max UV Index"},{"name":"W","units":"","$":"Weather Type"},{"name":"PPd","units":"%","$":"Precipitation Probability Day"},{"name":"PPn","units":"%","$":"Precipitation Probability Night"}]},"DV":{"dataDate":"2024-07-20T09:00:00Z","type":"Forecast","Location":{"i":"3210","lat":"54.5181","lon":"-3.615","name":"ST. BEES HEAD","country":"ENGLAND","continent":"EUROPE","elevation":"124.0","Period":[{"type":"Day","value":"2024-07-20Z","Rep":[{"D":"SSE","Gn":"9","Hn":"93","PPd":"91","S":"7","V":"GO","Dm":"19","FDm":"18","W":"15","U":"3","$":"Day"},{"D":"NW","Gm":"22","Hm":"93","PPn":"80","S":"16","V":"VG","Nm":"11","FNm":"9","W":"12","$":"Night"}]},{"type":"Day","value":"2024-07-21Z","Rep":[{"D":"WSW","Gn":"16","Hn":"78","PPd":"50","S":"11","V":"VG","Dm":"16","FDm":"13","W":"7","U":"5","$":"Day"},{"D":"S","Gm":"29","Hm":"94","PPn":"85","S":"18","V":"MO","Nm":"13","FNm":"11","W":"15","$":"Night"}]},{"type":"Day","value":"2024-07-22Z","Rep":[{"D":"WSW","Gn":"29","Hn":"90","PPd":"55","S":"18","V":"VG","Dm":"17","FDm":"13","W":"12","U":"5","$":"Day"},{"D":"NW","Gm":"20","Hm":"89","PPn":"9","S":"13","V":"VG","Nm":"12","FNm":"11","W":"0","$":"Night"}]},{"type":"Day","value":"2024-07-23Z","Rep":[{"D":"WNW","Gn":"20","Hn":"69","PPd":"5","S":"11","V":"VG","Dm":"18","FDm":"15","W":"3","U":"7","$":"Day"},{"D":"WSW","Gm":"9","Hm":"91","PPn":"4","S":"7","V":"VG","Nm":"11","FNm":"12","W":"7","$":"Night"}]},{"type":"Day","value":"2024-07-24Z","Rep":[{"D":"SSW","Gn":"29","Hn":"74","PPd":"60","S":"16","V":"VG","Dm":"18","FDm":"14","W":"7","U":"6","$":"Day"},{"D":"SSW","Gm":"25","Hm":"95","PPn":"81","S":"16","V":"MO","Nm":"14","FNm":"12","W":"15","$":"Night"}]}]}}}}
"""

data_dict = json.loads(data)

# 从 'Wx' 部分提取参数信息
params = {param['name']: param['$'] for param in data_dict['SiteRep']['Wx']['Param']}

# 从 'DV' 部分提取数据
records = []
for period in data_dict['SiteRep']['DV']['Location']['Period']:
    for rep in period['Rep']:
        record = {'date': period['value'], 'day_night': rep.pop('$'), **rep}
        records.append(record)

df = pd.DataFrame(records)

# 使用从 'Wx' 部分提取的参数信息重命名列
df = df.rename(columns=params)

print(df)

这将创建一个 DataFrame,其中包含以下列:

  • date:日期
  • day_night:是白天还是夜晚的数据
  • Feels Like Day Maximum Temperature:白天的最高体感温度
  • Feels Like Night Minimum Temperature:夜间的最低体感温度
  • Day Maximum Temperature:白天的最高温度
  • Night Minimum Temperature:夜间的最低温度
  • Wind Gust Noon:中午的风力
  • Wind Gust Midnight:午夜的风力
  • Screen Relative Humidity Noon:中午的相对湿度
  • Screen Relative Humidity Midnight:午夜的相对湿度
  • Visibility:能见度
  • Wind Direction:风向
  • Wind Speed:风速
  • Max UV Index:紫外线指数
  • Weather Type:天气类型
  • Precipitation Probability Day:白天下雨的概率
  • Precipitation Probability Night:晚上下雨的概率

这个 DataFrame 的结构更易于分析和使用。

标签:python,json,pandas,datapoint
From: 78772540

相关文章

  • python查看某个包的当前安装版本以及最新版本
    方法1:使用pip和--outdated参数你可以使用piplist--outdated命令来查看哪些包有更新版本可用。这个命令会列出所有安装的包以及它们在PyPI上的最新版本。piplist--outdated这将输出一个包列表,包含当前版本和最新版本,例如:PackageVersionLatestTyp......
  • 【python】错误 SyntaxError: invalid syntax的解决方法总结
    【python】错误SyntaxError:invalidsyntax的解决方法总结在Python编程中,SyntaxError:invalidsyntax是一个常见的错误,通常表示Python解释器在尝试解析代码时遇到了语法错误。这种错误可能由多种原因引起,包括拼写错误、缺少关键字、不恰当的缩进等。本文将深入探讨......
  • MiniQMT国债逆回购策略Python代码全解析
    文章目录......
  • python—爬虫的初步了解
    Python爬虫(WebScraping)是一种自动化从网站上提取数据的技术。Python由于其简洁的语法、丰富的库和强大的社区支持,成为了实现网络爬虫的首选语言之一。下面是一些Python爬虫的基本概念和步骤:1.爬虫的基本概念请求(Request):爬虫向服务器发送的请求,通常包括URL、HTTP方法(如......
  • Python集合的概念与使用
      在Python中,集合(set)是一种无序且不包含重复元素的数据结构。集合对象由一组大括号 或 函数创建,但请注意,大括号 在没有元素的情况下会创建一个空字典,而不是空集合。因此,当你想创建一个空集合时,应该使用 set()函数而不是 set{}集合的特点无序:集合中的元素没有特定的......
  • python——面向对象(2)继承与多态
    文章目录继承的基本语法继承的特点继承的类型多态在Python中,继承是一种基于已存在的类来创建新类的方式。这种机制允许我们定义一个通用的类,然后基于这个类来定义一些特定的类,这些特定的类将继承通用类的属性和方法,同时也可以添加或覆盖一些新的属性和方法。这种方式......
  • Python 更换 pip 源详细指南
    目录前言pip国内源临时换源方法一:添加参数方法二:设置环境变量永久换源方法三:修改配置方法四:pip命令修改总结前言在我们使用Python3时,pip是一个不可或缺的工具,它用于安装和管理第三方库。然而,有时我们可能会遇到Python库下载速度慢的问题,这是因为默认的pi......
  • 使用Python的Turtle库绘制中国火箭模型,点燃航天梦!
    引言在编程教育中,turtle模块是一个非常受欢迎的图形化编程工具,尤其适合初学者学习和实践。它允许我们通过控制一个可以在屏幕上移动的“小乌龟”来绘制各种形状和图案,从而让编程变得直观且有趣。Turtle库简介turtle是Python标准库的一部分,它提供了一个简单而强大的绘图环......
  • 用Python调整图片尺寸教程【附源码】
    就像我们学习数学一样,多做题多练习,才会熟能生巧。更多项目源码,实战案例,文件夹领取方式在文末学习Python也是一样,练习才是学好Python的最优解。只有不停的敲代码,不断练习,才能不断进步。实操练习你是否遇到过上传照片有大小要求?不管是上传证件照报名参赛,总会有一个不要......
  • 干货 |Python中的循环结构
    应用场景我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中,让机器人向球门方向移动就是一个需要重复的动作,当然这里还会......