Open-Meteo API逐小时数据处理:拆分为0-24列及单列浓缩求助
解决方案:Open-Meteo逐小时气象数据格式转换
首先纠正你代码里的核心问题:直接将整个api_data转为DataFrame是错误的,因为api_data里的hourly是嵌套字典(包含time和各辐射指标的列表),而非字符串。正确的做法是直接提取hourly字段来构建初始DataFrame。
以下是针对你两个需求的具体实现:
第一步:正确解析API数据
import requests import pandas as pd api_url = "https://api.open-meteo.com/v1/forecast?latitude=51.4325&longitude=6.7652&hourly=shortwave_radiation,direct_radiation,diffuse_radiation,direct_normal_irradiance,terrestrial_radiation" response = requests.get(api_url) if response.status_code == 200: api_data = response.json() # 直接用hourly字典构建DataFrame,这是正确的初始数据结构 hourly_df = pd.DataFrame(api_data['hourly']) else: print("Fehler beim Abrufen der API-Daten") hourly_df = None
此时hourly_df的结构是:每行对应一个小时,列包含time和各个辐射指标(如shortwave_radiation)。
需求一:将逐小时数据浓缩为一小时间隔的单列(长格式)
如果你的需求是把所有辐射指标的数值合并到单列,同时保留时间和指标类型,可以用pd.melt实现:
# 转换为长格式:time(时间)、radiation_type(指标类型)、value(数值) long_format_df = hourly_df.melt( id_vars='time', var_name='radiation_type', value_name='radiation_value' )
最终long_format_df的结构示例:
| time | radiation_type | radiation_value |
|---|---|---|
| 2024-05-20T00:00:00 | shortwave_radiation | 0.0 |
| 2024-05-20T01:00:00 | shortwave_radiation | 0.0 |
| ... | ... | ... |
| 2024-05-20T00:00:00 | terrestrial_radiation | 200.1 |
需求二:拆分为标签0至23的多列结构(宽格式)
这里默认你需要按日期分组,将每天的0-23小时作为列,每个辐射指标单独生成宽表(或合并为多层级列)。步骤如下:
- 从
time列提取日期和小时:
# 转换time列为datetime类型,方便提取日期和小时 hourly_df['time'] = pd.to_datetime(hourly_df['time']) hourly_df['date'] = hourly_df['time'].dt.date hourly_df['hour'] = hourly_df['time'].dt.hour
- 按日期和小时重塑为宽格式(以
shortwave_radiation为例):
# 单指标宽表:每行是一个日期,列是0-23小时的辐射值 wide_format_single = hourly_df.pivot( index='date', columns='hour', values='shortwave_radiation' ).rename_axis(columns=None).reset_index()
如果需要同时包含所有辐射指标,可以用多列pivot:
# 多指标宽表:列是(辐射指标,小时)的层级结构 wide_format_multi = hourly_df.pivot( index='date', columns=['hour'], values=['shortwave_radiation', 'direct_radiation', 'diffuse_radiation', 'direct_normal_irradiance', 'terrestrial_radiation'] ) # 也可以将层级列展开为"指标_小时"的格式 wide_format_multi.columns = wide_format_multi.columns.map(lambda x: f"{x[0]}_{x[1]}") wide_format_multi = wide_format_multi.reset_index()
内容的提问来源于stack exchange,提问作者Tobias Riepe
相关产品推荐
相关产品推荐

